Команды из синхронизации; Вы не можете выполнить эту команду теперь

Проблема в том, что долгое время QueryParser не обрабатывал запросы должным образом (не применял анализаторы), если они были FuzzyQuery , WildcardQuery , PrefixQuery , RegexpQuery

Для решения этой проблемы у Lucene был класс AnalyzingQueryParser , который переопределяет стандартный QueryParser Lucene, так что Fuzzy-, Prefix- , Range- и WildcardQuerys также передаются через данный анализатор, но подстановочные символы * и? не удаляйся из условий поиска.

Однако, начиная с Lucene 7.4, эта функциональность была объединена в QueryParserBase , которые теперь имеют соответствующие методы для обработки этих запросов, такие как:

protected Query getFuzzyQuery(String field,
                              String termStr,
                              float minSimilarity)

Итак, вместо создания класса QueryParser, вы должны создать ComplexPhraseQueryParser, который переопределяет этот метод, и вызовите parse отсюда.

86
задан Peter O. 23 October 2012 в 13:01
поделиться

5 ответов

У Вас не может быть двух одновременных запросов, потому что использование mysqli освободило буфер запросы по умолчанию (для подготовленных операторов; это - противоположное для ванили mysql_query). Можно или выбрать первый в массив и цикл через это, или сказать mysqli буферизовать запросы (использующий $stmt->store_result() ).

См. здесь для деталей.

108
ответ дан HoLyVieR 24 November 2019 в 08:01
поделиться

Проблемой является клиентская библиотека C MySQL, на которой большей части MySQL API основаны. Проблема состоит в том, что библиотека C не поддерживает одновременное выполнение запросов, таким образом, все API, созданные к тому же также, не делают. Даже если Вы используете, освободил буфер запросы. Это - одна причина, почему асинхронный MySQL API был записан. Это связывается непосредственно с сервером MySQL с помощью TCP, и проводной протокол делает , поддерживают одновременные запросы.

Ваше решение состоит в том, чтобы или изменить алгоритм, таким образом, Вы не должны иметь обоих происходящих сразу или изменить их для использования буферизованных запросов, который является, вероятно, одной из исходных причин их существования в библиотеке C (другой, должен обеспечить своего рода курсор).

1
ответ дан staticsan 24 November 2019 в 08:01
поделиться

Я думаю, что проблема состоит в том, что Вы устанавливаете новую связь в функции и затем не закрываете ее в конце. Почему Вы не пытаетесь передать в существующем соединении и снова использовать его?

Другая возможность состоит в том, что Вы возвращаетесь из середины из некоторое время выборки цикла. Вы никогда не завершаете ту внешнюю выборку.

0
ответ дан Paul Tomblin 24 November 2019 в 08:01
поделиться

Другая причина: store_result () нельзя назвать дважды.

, Например, в следующем коде, Ошибка 5 печатается.

<?php

$db = new mysqli("localhost", "something", "something", "something");

$stmt = $db->stmt_init();
if ($stmt->error) printf("Error 1 : %s\n", $stmt->error);

$stmt->prepare("select 1");
if ($stmt->error) printf("Error 2 : %s\n", $stmt->error);

$stmt->execute();
if ($stmt->error) printf("Error 3 : %s\n", $stmt->error);

$stmt->store_result();
if ($stmt->error) printf("Error 4 : %s\n", $stmt->error);

$stmt->store_result();
if ($stmt->error) printf("Error 5 : %s\n", $stmt->error);

(Это не может относиться к исходному примеру кода, но это может относиться к людям, ищущим ответы на эту ошибку.)

0
ответ дан 24 November 2019 в 08:01
поделиться

Я решил эту проблему в мое приложение C - вот как я это сделал:

  1. Цитата из форумов mysql:

    Эта ошибка возникает, когда вы завершаете свой запрос разделителем точки с запятой внутри приложения . Хотя требуется завершить запрос разделителем точки с запятой при его выполнении из командной строки или в браузере запросов, удалите разделитель из запроса внутри вашего приложения.

  2. После выполнения моего запроса и обработки результатов [C API : mysql_store_result () ], Я перебираю любые дальнейшие потенциально ожидающие результаты, которые возникают в результате выполнения нескольких операторов SQL, таких как два или более операторов select (подряд без обработки результатов).

    Дело в том, что мои процедуры не возвращают несколько результатов, а база данных не знает этого, пока я не выполню: [C API: mysql_next_result () ]. Я делаю это в цикле (для хорошей оценки), пока он не вернет ненулевое значение. Тогда текущий обработчик соединения знает, что можно выполнить другой запрос (я кэширую свои обработчики, чтобы минимизировать накладные расходы на соединение).

    Это цикл, который я использую:

     for (; mysql_next_result (mysql_handler) == 0;) t возвращает несколько результатов, но база данных не знает этого, пока я не выполню: [C API:  mysql_next_result () ]. Я делаю это в цикле (для хорошей оценки), пока он не вернет ненулевое значение. Тогда текущий обработчик соединения знает, что можно выполнить другой запрос (я кэширую свои обработчики, чтобы минимизировать накладные расходы на соединение). 

    Это цикл, который я использую:

     for (; mysql_next_result (mysql_handler) == 0;) t возвращает несколько результатов, но база данных не знает этого, пока я не выполню: [C API:  mysql_next_result () ]. Я делаю это в цикле (для хорошей оценки), пока он не вернет ненулевое значение. Тогда текущий обработчик соединения знает, что можно выполнить другой запрос (я кэширую свои обработчики, чтобы минимизировать накладные расходы на соединение). 

    Это цикл, который я использую:

     for (; mysql_next_result (mysql_handler) == 0;)
     /* ничего не делать */;
    

Я не знаю PHP, но уверен, что в нем есть нечто подобное.

31
ответ дан 24 November 2019 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: