Сетевая задержка под Hibernate / c3p0 / MySQL - PullRequest
0 голосов
/ 02 сентября 2010

Я подключаюсь к базе данных MySQL (InnoDB) через соединение с довольно высокой задержкой (~ 80 мс), но относительно высокой пропускной способностью.

Я заметил, что время запроса значительно варьируется в зависимости от того, как запрос был выдан. В следующих примерах я выполняю запрос для одной маленькой строки по первичному ключу. Время запроса:

  • Клиент командной строки (mysql): ~ 160 мс
  • Сырой JDBC: ~ 240 мс
  • Hibernate: ~ 400 мс (начало ~ 0 мс, получение ~ 160 мс, фиксация ~ 240 мс)
  • Hibernate, L2: ~ 240 мс (начало ~ 0 мс, получение ~ 0 мс, фиксация ~ 240 мс)
  • Hibernate, c3p0: ~ 880 мс (начало ~ 160 мс, получение ~ 240 мс, фиксация ~ 480 мс)
  • Hibernate, L2 + c3p0: ~ 640 мс (начало ~ 160 мс, получение ~ 0 мс, фиксация ~ 480 мс)

(«L2» означает, что кэширование Hibernate второго уровня было включено, «c3p0» означает, что c3p0 было включено, «begin», «get» и «commit» - это временные интервалы для различных суб-методов, вызываемых во время запроса) *

Это, примерно, результаты "устойчивого состояния", поэтому кэш L2 горячий, а время запуска Hibernate игнорируется. Я предполагаю, что "get" обычно равен 0 мс, когда кэш L2 включен, потому что фактически не выдается get.

Мои вопросы:

  • Почему все запросы так много кратны задержке сети? Кажется, что даже клиент командной строки mysql требует двух циклов для простого запроса.
  • Почему все запросы JDBC / Hibernate намного медленнее, чем клиент командной строки? Кажется, что даже сырой JDBC-клиент требует трех циклов.
  • Почему c3p0, кажется, делает все хуже? Насколько я могу судить, я отключил тестирование соединения, которое иначе могло бы объяснить ситуацию.

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

У меня нет совета по вашей проблеме, но есть несколько методов отладки, которые помогут вам понять, что происходит.Если вы можете добавить параметр соединения в URL-адрес соединения, драйвер JDBC будет регистрировать в основном все данные, передаваемые по проводам, с временными параметрами:

jdbc: mysql: // сервер / база данных? ProfileSQL = true

http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

Другой способ посмотреть на это - наблюдать за трафиком вашей сети через tcpdump.mk-query-digest из инструментов Maatkit может прочитать вывод дампа и помочь вам точно выяснить, что происходит:

http://www.mysqlperformanceblog.com/2009/07/01/gathering-queries-from-a-server-with-maatkit-and-tcpdump/

Надеюсь, это поможет.

0 голосов
/ 27 сентября 2010
  • Если вы используете spring, используйте lazydatasource, чтобы открывать соединение только тогда, когда вы его используете
  • Попробуйте с BoneCP вместо c3p0 для лучшей производительности.
...