JDB C незакрытые соединения - PullRequest
0 голосов
/ 19 февраля 2020

Если мы забудем закрыть Java JDB C соединение (скажем, oracle) в коде, хотелось бы знать, будет ли соединение оставаться в конце БД навсегда (oracle) или Oracle имеет какое-либо реализация в его конце, чтобы автоматически освободить соединения с БД через некоторое время?

try{
       ds.getConnection();
       //do some business logic

   }catch(Exception e){
       //handle exceptions

   }  finally{
           //let's say DB connection is NOT cosed..
      }

Что происходит с открытым соединением в приведенном выше коде? Соединение автоматически освобождается на стороне базы данных после выхода из программы java? Я понимаю, что настоятельно не рекомендуется и плохая практика не закрывать соединения с БД. Я просто хочу знать последствия и понять, как oracle обрабатывает незакрытые соединения.

1 Ответ

1 голос
/ 19 февраля 2020

После завершения работы виртуальной машины, более или менее нормально (завершаются все потоки, не являющиеся демонами, вызывается System.exit или принимается сигнал уничтожения, например нажатие CTRL + C в терминале), или ненормально ( Вы отключаетесь через шнур питания или сигнал прерывания заставляет ядро ​​просто жестко выйти из вашей виртуальной машины), все соединения TCP / IP go автоматически удаляются, и с этим соединение очищается.

Но до выхода из виртуальной машины вы не получаете никаких гарантий. Поведение преднамеренно не указано (как, например, вы должны закрыть их самостоятельно. Если вы этого не сделаете, гарантии не предоставляются), и то, что на самом деле происходит, зависит от состояния вашего компьютера (как это зависит от запуска g c и когда те go зависит от того, какая песня воспроизводится в вашем проигрывателе musi c до фазы луны), и от используемого драйвера JDB C.

Вы можете использовать инструменты lint и плагины IDE признать, что вы не закрываете свои соединения. Кроме того, ваш фрагмент более 10 лет устарел. Рекомендуемый и более простой способ убедиться, что ваше соединение не d ie, это использовать:

try (Connection con = ds.getConnection()) {
    // use 'con' here
} // no need for a catch or finally.

Или использовать пулы соединений (например, HikariCP) вместе с абстракцией для создания JDB * 1016. * менее раздражающий, такой как JDBI или JOOQ.

...