当前位置: 首页 > 知识库问答 >
问题:

Oracle数据库12.2.0.1JDBC驱动程序有错误吗?

帅德惠
2023-03-14

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

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

因此,垃圾收集器删除了所有现有连接,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

数据库访问运行良好——除了我糟糕的连接池。在调用“连接=新向量(池大小)”后,Oracle数据库不会删除打开的连接,并且打开的JDBC连接的数量每天都在增加——直到Oracle崩溃(打开的JDBC连接太多)。

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

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

在所有旧的JDBC驱动程序中,都不会发生此错误-只有在新的ojdbc8中才会发生此错误。罐子

如果无法访问,JDBC驱动程序应该自动关闭所有与数据库相关的对象(例如ResultSets)。我不相信每个JDBC开发人员都会在数据库操作完成后关闭ResultSet对象。我还没有测试ojdbc8.jar是否会关闭这些未关闭的ResultSet对象,但如果没有,一些程序将来会爆炸。

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

共有3个答案

韩彦君
2023-03-14

您可以使用通用连接池(UCP),它是Java连接池。请参阅UCPSample.java.此外,有关更多详细信息,请参阅UCP开发人员指南。

丁景山
2023-03-14

并非每个JDBC开发人员都会关闭资源,但每个优秀的开发人员都会关闭资源。

如果您在池中有连接,它们是可强访问的。这意味着它们不会被GC'd和finaliz()方法(如果驱动程序类中存在)将不会调用释放资源。

首先不要责怪驱动程序,它们与您的代码不同,往往会经过大量测试。

阴波峻
2023-03-14

不鼓励使用Java中的终结器丢弃资源1、2。

您应该切换到经过良好测试的池化库,例如HikariCP。有很多陷阱,例如在发生回滚后如何正确重置连接,请参阅池分析或不良行为:处理数据库。自己编写和维护此代码会适得其反。

 类似资料:
  • 我正在尝试在springboot项目中使用h2数据库,我是HikariDataSource,我得到了以下例外: 我认为我的pom.xml和配置类是正确的 url:jdbc:h2:~/test-driverClassName:org。h2、司机 关于我做错了什么有线索吗?

  • 我在本地有一个引导corda网络,并将这些工件分发给相应的VM。当我启动其中一个节点时,我收到以下错误:我使用azure sql作为后端,并且使用corda Enterprise 4.3编译了jar,并且使用的数据库驱动程序是jdbc 6.4。 IntelliJ项目目标设置为仅Javajdk 1.8。 基本信息。-数据库连接url是< br> : jdbc:sqlserver://

  • 我正在使用一台全新的开发pc,需要测试一个在本地GlassFish服务器3.1上运行的个人应用程序。2,并应连接到名为“funkOneDB”的本地SQL数据库(我的IDE是NetBeans 7.2.1)。但我无法让GlassFish服务器与数据库连接,问题似乎与GlassFish服务器目录中的SQL驱动程序(位置)有关(几行中有更多问题细节)。 我相当肯定我在GlassFishServer上正确地

  • 问题内容: 最终用户(开发人员或生产人员)可以推荐一个Sql驱动程序包,最好使用“ database / sql”包。我对Postgres,ODBC,MySql(以及可能用于高容量的其他商品(即,不是Sqlite)的其他商品)感兴趣,这些商品最好可在Windows和/或Linux(最好同时使用)上使用。令我感兴趣的是,它可能需要最近进行了更新/维护,并且必须与最新的Go版本一起使用。效率(吞吐量)

  • 我创建了一个存储空间类型的结构,并创建了一个扫描函数来帮助查询数据库中的行。我有问题插入这种类型。 我可以使用以下sql插入数据; 如果在database/sql/driver中使用值接口; 类型值接口{} 价值是司机必须能够处理的价值。它要么是nil,要么是以下类型之一的实例: int64 浮动64 布尔 []字节 字符串[*]除行以外的所有位置。下一步。 时间,时间 并使用此代码; 最后,我将

  • 服务器上的mongodb版本将比驱动程序版本旧。我的java驱动程序版本是3.6,Mongo-版本显示我是2.4 我该怎么解决这个问题?