Сетевая задержка под Hibernate / c3p0 / MySQL

0

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

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

  • Клиент командной строки (mysql): ~ 160 мс
  • Raw JDBC: ~ 240 мс
  • Спящий режим: ~ 400 мс (начало ~ 0 мс, ~ 160 мс, ~ 240 мс).
  • Hibernate, L2: ~ 240ms (~ 0ms begin, ~ 0ms get, ~ 240ms commit)
  • Hibernate, c3p0: ~ 880мс (~ 160 мс, ~ 240 мс, ~ 480 мс)
  • Спящий режим, L2 + c3p0: ~ 640 мс (~ 160 мс, ~ 0 мс, ~ 480 мс)

( "L2" означает, что кэширование второго уровня для Hibernate включено, "c3p0" означает, что c3p0 был включен, "начать", "получить" и "совершить" - это тайминг для различных под-методов, вызванных во время запроса)

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

Мои вопросы:

  • Почему все запросы имеют такие большие кратные задержки в сети? Даже для клиента командной строки mysql, по-видимому, требуется 2 раунда для простого запроса.
  • Почему все запросы JDBC/Hibernate намного медленнее, чем клиент командной строки? Даже необработанный клиент JDBC, по-видимому, требует 3 раундовых поездки.
  • Почему c3p0, кажется, делает все хуже? У меня есть, насколько я могу судить, тестирование отключенных подключений, что в противном случае могло бы объясняться.
Теги:
hibernate
jdbc
c3p0

2 ответа

1

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

JDBC: MySQL://сервер/база данных profileSQL = истина

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
    Спасибо! Эти параметры профилирования JDBC выглядят очень полезными. Надеюсь, мне не нужно заходить в tcpdump, но приятно знать об инструментах Maatkit :)
0
  • Если вы используете spring, используйте lazydatasource, чтобы открывать соединение только после его фактического использования.
  • Попробуйте использовать BoneCP вместо c3p0 для лучшей производительности.
  • 0
    Мы не используем Spring, но BoneCP выглядит неплохо. Я попробую и доложу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню