Подтвердить что ты не робот

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: добавлена ​​информация, которая была запрошена в правильном ответе для тех, кто находит это позже

4b9b3361

Ответ 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.