ВЫБЕРИТЕ 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.