Это правильное поведение, если вы не закрываете соединения JDBC.
Вы должны вызывать метод close () каждого ресурса JDBC, когда вы закончили использовать его и другие ресурсы JDBC, полученные с ним.
Это относится к Connection, Statement / PreparedStatement / CallableStatement, ResultSet и т. Д.
Если вам не удастся сделать это, вы начнете накапливать потенциально огромные и, вероятно, очень ограниченные ресурсы на сервере SQL, для начала.
В конце концов, соединения не будут предоставлены, запросы будут выполнены, и результаты не будут выполнены или зависнут.
Вы также можете заметить, что ваши операторы INSERT / UPDATE / DELETE зависли, если вам не удалось выполнить commit () или rollback () при завершении каждой транзакции, если для свойства autoCommit не установлено значение true.
Что я видел, так это то, что если вы примените вышеупомянутую строгость к своему клиентскому коду JDBC, то JDBC и ваш SQL-сервер будут работать великолепно слаженно. Если вы напишите дерьмо, то все будет вести себя как дерьмо.
Многие люди пишут вызовы JDBC, ожидая, что «что-то» еще отпустит каждую вещь, вызывая close (), потому что это скучно, и приложение и сервер не сразу выходят из строя, когда их пропускают.
Это правда, но эти программисты написали свои программы для игры "99 бутылок пива на стене" со своими серверами.
Ресурсы будут исчерпаны, и запросы будут иметь тенденцию приводить к одному или нескольким из следующих событий: запросы подключения завершаются немедленно, операторы SQL не выполняются немедленно или зависают навсегда или пока не истечет какой-то сокрушительный таймер времени ожидания транзакции и т. Д.
Следовательно, самый быстрый способ решения этих типов проблем SQL - это не обвинять сервер SQL, сервер приложений, веб-контейнер, драйверы JDBC или разочаровывающее отсутствие искусственного интеллекта, встроенного в сборщик мусора Java.
Самый быстрый способ их решения - застрелить парня, который написал вызовы JDBC в вашем приложении, которые общаются с вашим сервером SQL с помощью дротика Nerf. Когда он говорит: «Зачем ты это сделал для…?!» Просто укажите на этот пост и скажите ему, чтобы прочитать его. (Помните, чтобы не стрелять в глаза, вещи в его руках, вещи, которые могут быть опасными / хрупкими и т. Д.)
Что касается пула соединений, решающего ваши проблемы ... нет. Извините, пулы соединений просто ускоряют вызов, чтобы получить соединение в вашем приложении, передавая ему предварительно выделенное, возможно, повторно используемое соединение.
Зубная фея кладет деньги под подушку, пасхальный кролик кладет яйца и конфеты под кусты, а Дед Мороз кладет подарки под елку. Но, извините, что разбил ваши иллюзии - сервер SQL и драйвер JDBC закрывают не все, потому что вы «забыли» закрыть все ресурсы, которые вы выделили сами.