В 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-соединения не закрывались автоматически?

0
SipCat 20 Авг 2018 в 18:34

3 ответа

Лучший ответ

В зависимости от финализаторов в Java отбрасывать ресурсы не рекомендуется 1, 2.

Вы должны переключиться на хорошо протестированную библиотеку пулов, например HikariCP. Есть много ошибок, например Как правильно сбросить соединение после отката, см. Анализ пула или Плохое поведение: обработка базы данных отключена. Написание и поддержание этого кода самостоятельно контрпродуктивно.

2
Karol Dowbecki 20 Авг 2018 в 15:42

Не каждый разработчик JDBC закроет ресурсы, но это сделает каждый хороший разработчик.

Если у вас есть соединения в пуле, они сильно доступны. Это означает, что они не будут GC'd, и метод finalize() (если таковой существует в классах драйвера), который освободит ресурсы, вызываться не будет.

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

0
Kayaman 20 Авг 2018 в 15:42

Вы можете использовать универсальный пул соединений (UCP), который является пулом соединений Java. Обратитесь к UCPSample.java . Также см. руководство разработчика UCP Для более подробной информации.

0
Nirmala 31 Авг 2018 в 20:16
51934115