Должны ли соединения JDBC соответствовать сетевым соединениям netstat?

У нас есть приложение Tomcat6/Hibernate 3.x/Postgres, и я беспомощно не в курсе, немного не понимаю, что представляет собой «связь» между сервером приложений и БД, по крайней мере, как насколько JDBC идет.

Якобы мы используем пул соединений (Tomcat JDBC), который открывает 10 подключений при запуске. Netstat, кажется, подтверждает это:

netstat -nato | grep 5432
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)
::ffff:192.168.42.11:5432   ESTABLISHED off (0.00/0/0)

Но эти соединения всегда остаются в выключенном состоянии. Когда я устанавливаю журналы Hibernate на DEBUG для JDBC, я вижу массу вызовов openConnection() и closeConnection() (более 100 для простой веб-страницы), но вывод netstat остается неизменным.

Значит, JDBC и сетевые соединения не создаются в соотношении 1:1? Является ли это просто доказательством того, что пул соединений действительно работает?


person 8bitartist    schedule 29.01.2015    source источник
comment
Да, это свидетельство работы пула.   -  person user207421    schedule 30.01.2015
comment
Спасибо за ответ, EJP. Однако немного запутался: запуск jconsole удаленно показывает мне очиститель пула, но никаких других потоков, связанных с пулом. Можно с уверенностью предположить, что это всего лишь настройка нашего приложения и jconsole?   -  person 8bitartist    schedule 30.01.2015
comment
Почему могут быть какие-либо другие потоки, связанные с пулом?   -  person user207421    schedule 30.01.2015
comment
Честно говоря, я не был уверен, что я должен увидеть на выходе. Думаю, я ожидал увидеть отдельный поток для каждого соединения в пуле (не то, чтобы у меня была какая-то причина; я изучаю это по ходу дела). Спасибо еще раз за помощь.   -  person 8bitartist    schedule 30.01.2015


Ответы (1)


Вот как работает пул соединений. Пул открывает N физических подключений к базе данных, и когда приложение получает подключение, оно получает файл JDBC Connection proxy, а не фактический объект Driver Connection.

Когда транзакция приложения завершена, Connection.close(). Прокси перехватит метод close и просто вернет объект Connection в пул, вместо фактического закрытия физического соединения.

Причина, по которой вы видите так много методов openConnection() и closeConnection(), можно объяснить следующим образом:

  • вы используете JTA, который требует агрессивный сброс соединения для каждого оператора.
  • вы не заключаете свои операции в один метод службы @Transactional, а по умолчанию Hibernate выполняет автоматическую фиксацию, поэтому каждый оператор будет выполняться в своей собственной конкретной транзакции (и каждый оператор фактически потребует цикла получения/освобождения соединения).
  • вы интенсивно используете Ajax, поэтому загрузка главной страницы — это не просто один HTTP-запрос. Чем больше асинхронных запросов вы сделали, тем больше транзакций потребуется, тем больше нагрузки вы собираетесь оказать на свой пул соединений.

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

person Vlad Mihalcea    schedule 30.01.2015
comment
Ах. Мы используем автофиксацию в наших транзакциях Hibernate, и мы установили режим выпуска на «автоматический» (мы не используем JTA). Я проверю FlexyPool. Спасибо! Как только у меня будет достаточно представителей, я проголосую за этот ответ - отличное объяснение взаимосвязи между JDBC и физическими соединениями. - person 8bitartist; 30.01.2015
comment
Спасибо за добрые слова. Если у вас есть какой-либо другой интересный вопрос (например, этот), связанный с Hibernate/transactions/JDBC/Spring/Database, вы можете связаться со мной, и я посмотрю. FlexyPool — это небольшая, но мощная утилита, которую используют некоторые крупные игроки в нашей отрасли (банки из США и Швейцарии). - person Vlad Mihalcea; 31.01.2015