SELECT 1 из DUAL: MySQL
При просмотре журнала запросов я вижу нечетный шаблон, для которого у меня нет объяснений.
После практически каждого запроса у меня есть "выбрать 1 из 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
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 было установлено "выбрать 1 из DUAL" (очевидно), и, по-видимому, пул соединений по умолчанию использует testOnBorrow и testOnReturn для true, если запрос проверки не равен нулю.
Еще один вопрос, который возникает для меня, заключается в том, действительно ли мне нужно иметь запрос проверки, или если я могу получить повышение производительности, отключив его или, по крайней мере, уменьшив частоту с которой он используется. К сожалению, разработчик, который написал наш "менеджер баз данных", больше не с нами, поэтому я не могу попросить его оправдать его для меня. Любой вход был бы оценен. Я собираюсь выкапывать API и Google на некоторое время и отчитываться, если найду что-нибудь полезное.
EDIT: добавлена дополнительная информация
EDIT2: добавлена информация, которая была запрошена в правильном ответе для тех, кто находит это позже
Ответы
Ответ 1
Это может произойти из пула соединений, используемого вашим приложением. Мы используем простой запрос для проверки соединения.
Просто быстро посмотрел в источник на mysql-connector-j, и он не появился там.
Наиболее вероятной причиной является пул соединений.
Общие пулы соединений:
commons-dbcp имеет свойство конфигурации validationQuery
, это в сочетании с testOnBorrow
и testOnReturn
может вызывать утверждения, которые вы видите.
c3p0 имеет preferredTestQuery
, testConnectionOnCheckin
, testConnectionOnCheckout
и idleConnectionTestPeriod
Для чего я склонен настраивать тестирование соединения и проверку/заимствование, даже если это означает небольшую дополнительную сетевую болтовню.
Ответ 2
Я выполнил 100 вложений/дельта и протестировал как на DBCP, так и на C3PO.
DBCP:: testOnBorrow = true влияет на время отклика более чем на 4 раза.
C3P0:: testConnectionOnCheckout = true влияет на время отклика более чем на 3 раза.
Вот результаты:
DBCP - BasicDataSource
Среднее время для 100 транзакций (операция вставки)
testOnBorrow = false:: 219.01 мс
testOnBorrow = true:: 1071.56 ms
Среднее время для 100 транзакций (удаление отпечатка)
testOnBorrow = false:: 223.4 мс
testOnBorrow = true:: 1067.51 мс
C3PO - ComboPooledDataSource
Среднее время для 100 транзакций (операция вставки)
testConnectionOnCheckout = false:: 220.08 мс
testConnectionOnCheckout = true:: 661.44 ms
Среднее время для 100 транзакций (удаление отпечатка)
testConnectionOnCheckout = false:: 216.52 мс
testConnectionOnCheckout = true:: 648.29 ms
Затруднение: установка testOnBorrow = true в DBCP или testConnectionOnCheckout = true в C3PO влияет на производительность в 3-4 раза. Есть ли другие настройки, которые повысят производительность.
-Дурга Прасад
Ответ 3
"двойное" имя таблицы/объекта - это конструкция Oracle, которую MySQL поддерживает для совместимости, или для обеспечения цели для запросов, для которых нет цели, но люди хотят, чтобы все было тепло и нечетко. Например.
select curdate()
может быть
select curdate() from dual
Кто-то может обнюхать вас, если вы используете Oracle.