В 2006 году я написал свой пул JDBC-соединений для Oracle-Connections. Я сохранил коллекции в векторе, и каждую ночь я создавал новый объект Vector для инициализации пула соединений:
Соединения = новый вектор (размер пула);
Таким образом, сборщик мусора удалил все существующие соединения, а Oracle удалил соединения.
Если честно, это очень плохое решение - но оно работает без проблем 12 лет!
В этом году мы обновили нашу версию Oracle до 12.2.0.1.0, и я обновил драйвер Oracle-JDBC в своих сложных программах.
В настоящее время я использую драйвер JDBC Oracle Database 12.2.0.1 (ojdbc8.jar), загруженный с этого веб-сайта:
https://www.oracle.com/technetwork/database/features/jdbc/jdbc-ucp-122-3110062.html
Доступ к базе данных работает нормально - за исключением моего плохого пула соединений. После вызова «connections = new Vector (poolize)» Oracle-DB НЕ удаляет открытые соединения, и количество открытых JDBC-соединений увеличивается с каждым днем - до тех пор, пока Oracle не выйдет из строя (слишком много открытых JDBC-соединений).
Я знаю, что я должен закрыть каждое JDBC-соединение с помощью close (), а не только инициализировать Вектор, содержащий коллекции. Но мне интересно, почему новый JDBC-драйвер Oracle не удаляет все соединения после запуска сборки мусора.
Это ошибка нового JDBC-драйвера?
Во всех старых JDBC-драйверах эта ошибка не возникает - она возникает только с новым ojdbc8.jar.
JDBC-драйвер должен автоматически закрывать все объекты, связанные с базой данных (например, ResultSets), если они недоступны. Я не верю, что каждый JDBC-разработчик закроет ResultSet-объекты после завершения операции базы данных. Я не проверял, будет ли ojdbc8.jar закрывать такие незакрытые ResultSet-Objects, но в противном случае некоторые программы будут взорваны в будущем.
Как вы думаете, есть ли ошибка в новом JDBC-драйвере, потому что недоступные JDBC-соединения не закрывались автоматически?
3 ответа
В зависимости от финализаторов в Java отбрасывать ресурсы не рекомендуется 1, 2.
Вы должны переключиться на хорошо протестированную библиотеку пулов, например HikariCP. Есть много ошибок, например Как правильно сбросить соединение после отката, см. Анализ пула или Плохое поведение: обработка базы данных отключена. Написание и поддержание этого кода самостоятельно контрпродуктивно.
Не каждый разработчик JDBC закроет ресурсы, но это сделает каждый хороший разработчик.
Если у вас есть соединения в пуле, они сильно доступны. Это означает, что они не будут GC'd, и метод finalize()
(если таковой существует в классах драйвера), который освободит ресурсы, вызываться не будет.
Не вините сначала драйвера, они, как правило, подвергаются серьезному тестированию в отличие от вашего кода.
Вы можете использовать универсальный пул соединений (UCP), который является пулом соединений Java. Обратитесь к UCPSample.java а> . Также см. руководство разработчика UCP Для более подробной информации.
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].