ВЫБЕРИТЕ 1 из ДВОЙНОГО: MySQL - PullRequest
12 голосов
/ 28 мая 2009

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

После практически каждого запроса у меня есть «выбрать 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 было задано значение «выбрать 1 из DUAL» (очевидно), и, очевидно, пул соединений по умолчанию имеет значения testOnBorrow и testOnReturn, если запрос проверки не является нулевым.

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

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

EDIT2: добавлена ​​информация, которая запрашивалась в правильном ответе для всех, кто найдет это позже

Ответы [ 3 ]

24 голосов
/ 28 мая 2009

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

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

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

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

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

c3p0 имеет preferredTestQuery, testConnectionOnCheckin, testConnectionOnCheckout и idleConnectionTestPeriod

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

5 голосов
/ 18 февраля 2010

Я выполнил 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 раза. Есть ли другие настройки, которые повысят производительность?

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

1 голос
/ 28 мая 2009

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

select curdate()

может быть

select curdate() from dual

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

...