Oracle Database 12.2.0.1 JDBC Driver 中是否存在错误?

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

连接 = 新向量(池大小);

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

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

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

我目前使用的是从这个网站下载的 Oracle Database 12.2.0.1 JDBC Driver (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 驱动程序应自动关闭所有与数据库相关的对象(例如 ResultSets)。我不相信每个 JDBC 开发人员都会在数据库操作完成后关闭 ResultSet 对象。我没有测试过ojdbc8.jar 是否会关闭这些未关闭的ResultSet-Objects,但是如果没有,将来某些程序会炸毁。

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


德玛西亚99
浏览 209回答 3
3回答

炎炎设计

不鼓励依赖 Java 中的终结器来丢弃资源1 , 2。您应该切换到经过良好测试的池库,例如HikariCP。有很多问题,例如如何在发生回滚后正确重置连接,请参阅池分析或不良行为:处理数据库关闭。自己编写和维护此代码会适得其反。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java