java - Oracle Database 12.2.0.1 JDBC 驱动程序是否有错误?

标签 java oracle jdbc

2006 年,我为 Oracle 连接编写了自己的 JDBC 连接池。 我将集合存储在 Vector 中,每天晚上我都会实例化一个新的 Vector 对象来初始化连接池:

连接 = new Vector(poolsize);

因此,所有现有连接都被垃圾收集器删除,Oracle 也删除了这些连接。

说实话,这是一个非常糟糕的解决方案 - 但它运行了 12 年没有任何问题!

今年,我们将 Oracle 版本更新为 12.2.0.1.0,并且我在高级程序中更新了 Oracle-JDBC 驱动程序。

我当前使用的是 Oracle Database 12.2.0.1 JDBC 驱动程序 (ojdbc8.jar),从以下网站下载:

https://www.oracle.com/technetwork/database/features/jdbc/jdbc-ucp-122-3110062.html

数据库访问工作正常 - 除了我糟糕的连接池。 调用“connections = new Vector(poolsize)”后,Oracle-DB 不会删除打开的连接,并且打开的 JDBC 连接数量每天都会增加 - 直到 Oracle 崩溃(打开的 JDBC 连接过多)。

我知道我必须使用 close() 关闭每个 JDBC 连接,而不是仅初始化保存集合的 Vector。 但我想知道为什么新的 Oracle JDBC 驱动程序在垃圾收集运行后不删除所有连接。

这是新 JDBC 驱动程序的错误吗?

在所有较旧的 JDBC 驱动程序中,不会发生此错误 - 它仅在新的 ojdbc8.jar 中发生。

如果无法访问,则 JDBC 驱动程序应自动关闭所有与数据库相关的对象(例如 ResultSet)。 我不相信每个 JDBC 开发人员都会在数据库操作完成后关闭 ResultSet 对象。 我没有测试过ojdbc8.jar是否会关闭这种未关闭的ResultSet-Objects,但如果不关闭,以后有些程序就会崩溃。

您认为新的 JDBC 驱动程序中是否存在错误,因为无法自动关闭无法访问的 JDBC 连接?

最佳答案

不鼓励依赖 Java 中的终结器来丢弃资源 1 , 2 .

您应该切换到经过良好测试的池库,例如HikariCP 。有很多陷阱,例如发生回滚后如何正确重置连接,请参阅Pool AnalysisBad Behavior: Handling Database Down 。自己编写和维护此代码会适得其反。

关于java - Oracle Database 12.2.0.1 JDBC 驱动程序是否有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51934115/

相关文章:

java - 通过 REST API 调用 JBPM 流程并传入自定义对象时发生类转换异常

SQL - 使用 GROUP BY 时以逗号分隔的多个值

mysql - 无法从 Mac OS X 上的 Ballerina.io 连接到 MySQL

java - 如何使用 Java 将 "2012-03-04 00:00:00.0"转换为格式为 "dd-mm-yyyy HH:mm:ss"的日期

java - 我如何使用 Hibernate/JPA 在插入/更新/删除之前告诉数据库用户是谁?

mysql - 将Google表格中的特定范围插入到MYSQL

java - 使用 C# 检测特定程序何时关闭

java - 上传文件 : Comsuming WCF Web Service Using Java

Java 日期解析失败

oracle - 表的列名的逗号分隔列表