Будут ли закрыты соединения sql автоматически, если мы закроем JVM? - PullRequest
4 голосов
/ 23 декабря 2010

Я создал тестовую программу, которая создает 20 потоков, а затем эти потоки откроют много sql-соединений.Допустим, вы выполняете эту программу из Eclipse, а теперь, если вы закроете Eclipse.Будет ли это закрыть все открытые соединения SQL?Если нет, то что будет с ними?Будет ли отображаться 100 открытых соединений на стороне базы данных?Если да, то что делать в этом случае?

Ответы [ 2 ]

7 голосов
/ 23 декабря 2010

Соединения не будут закрываться, как при вызове java.sql.Connection.close().По сути, JVM, открывшая соединение, не может поддерживать соединения TCP / IP с базой данных.Они будут закрыты немедленно.Следовательно, «соединение» также будет отключено.Однако база данных может не реагировать сразу на это и поддерживать свои сеансы на некоторое время.

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

Я предполагаю, что поведение зависит от поставщика и / или конфигурации.Нет общего ответа.

0 голосов
/ 23 декабря 2010

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

  1. сделать это в блоке finally, который оборачивает сеанс соединения с БД.
  2. На всякий случай напишите метод finalize () и закройте там соединение.Это поможет закрыть соединение, когда что-то идет не так, и объект, подключенный к БД, будет собирать мусор до закрытия соединения.
  3. Вы можете создать ловушку отключения, которая автоматически вызывается JVM, когда процессспускаться.Это помогает в большинстве случаев, когда вы убиваете JVM извне (кроме kill -9 в unix)

Кстати, я считаю, что в вашем случае вам не нужно много подключений к БД.Попробуйте использовать один из всех ваших 100 потоков.

...