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 连接?
最佳答案
您应该切换到经过良好测试的池库,例如HikariCP 。有很多陷阱,例如发生回滚后如何正确重置连接,请参阅Pool Analysis或Bad Behavior: Handling Database Down 。自己编写和维护此代码会适得其反。
关于java - Oracle Database 12.2.0.1 JDBC 驱动程序是否有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51934115/