ВЫБЕРИТЕ 1 из ДВОЙНОГО: MySQL

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

После практически каждого запроса у меня есть "выбрать 1 из ДВОЙНЫХ".

Я понятия не имею, откуда это исходит, и я, конечно, не делаю запрос явно.

Журнал в основном выглядит так:

    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    10 Query       SELECT some normal query
    10 Query       select 1 from DUAL
    ...etc...

Кто-нибудь сталкивался с этой проблемой раньше?

Версия MySQL: 5.0.51

Драйвер: приложение Java 6 с использованием JDBC. MySQL-разъем-Java-5.1.6-bin.jar

Пул соединений: commons-dbcp 1.2.2

ValidationQuery был установлен на "select 1 from DUAL" (очевидно), и, очевидно, пул соединений по умолчанию имеет значения testOnBorrow и testOnReturn, если запрос проверки не равен NULL.

Еще один вопрос, который возникает у меня, заключается в том, нужен ли мне запрос проверки или нет, или я могу повысить производительность, отключив его или, по крайней мере, снизив частоту его использования. К сожалению, разработчик, который написал наш "менеджер баз данных", больше не с нами, поэтому я не могу попросить его объяснить это для меня. Любой вклад будет оценен. Я немного покопаюсь в API и Google и сообщу, если найду что-нибудь стоящее.

РЕДАКТИРОВАТЬ: добавил еще немного информации

РЕДАКТИРОВАТЬ 2: Добавлена ​​информация, которая была запрошена в правильном ответе для тех, кто находит это позже

3 ответа

Решение

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

Только что заглянул в исходный текст к mysql-connector-j, и он не идет оттуда.

Наиболее вероятной причиной является пул соединений.

Общие пулы соединений:

commons-dbcp имеет свойство конфигурации validationQueryэто в сочетании с testOnBorrow а также testOnReturn может привести к заявлениям, которые вы видите.

c3p0 имеет preferredTestQuery, testConnectionOnCheckin, testConnectionOnCheckout а также idleConnectionTestPeriod

Для чего это стоит, я склонен настраивать тестирование соединения и извлечение / заимствование, даже если это требует немного дополнительной болтовни в сети.

Я выполнил 100 вставок / дельт и протестировал как DBCP, так и C3PO.

DBCP:: testOnBorrow=true влияет на время отклика более чем в 4 раза.

C3P0:: testConnectionOnCheckout=true влияет на время отклика более чем в 3 раза.

Вот результаты: DBCP - BasicDataSource

Среднее время для 100 транзакций (операция вставки) testOnBorrow=false:: 219,01 мс testOnBorrow=true:: 1071,56 мс

Среднее время для 100 транзакций (удаление операции) testOnBorrow=false:: 223,4 мс testOnBorrow=true:: 1067,51 мс

C3PO - ComboPooledDataSource Среднее время для 100 транзакций (операция вставки) testConnectionOnCheckout=false:: 220,08 мс testConnectionOnCheckout=true:: 661,44 мс

Среднее время для 100 транзакций (удаление операции) testConnectionOnCheckout=false:: 216,52 мс testConnectionOnCheckout=true:: 648,29 мс

Вывод: установка testOnBorrow=true в DBCP или testConnectionOnCheckout=true в C3PO влияет на производительность в 3-4 раза. Есть ли другие настройки, которые повысят производительность?

-Дурга Прасад

"Двойное" имя таблицы / объекта - это конструкция Oracle, которую MySQL поддерживает для совместимости - или для обеспечения цели для запросов, у которых нет цели, но люди хотят, чтобы один чувствовал себя тепло и нечетко. Например

select curdate()

может быть

select curdate() from dual

Кто-то может вас понюхать, чтобы увидеть, используете ли вы Oracle.

Другие вопросы по тегам