我修复了一些与我们使用BasicDataSource的方式有关的错误,尽管我了解了其中的一部分,但仍然有一些未解决的问题:)

问题:
db故障后,应用程序无法自动连接到数据库。

应用程序将org.apache.commons.dbcp.BasicDataSource class用作与Oracle db的JDBC连接的TCP连接池。

固定:
经过一些研究,我发现在BasicDataSource中未设置testOnBorrow和testOnreturn。我提供了验证查询来测试连接。这解决了问题

池中的最大连接数设置为1

我的理解:
连接池将把连接移交给应用程序。
我认为正在发生的是,当数据库崩溃时,应用程序神奇地将错误集合返回到池中。现在,由于Pool不知道连接是否不好,因此它将在下次需要时将相同的连接移交给应用程序,从而导致应用程序不自动重新连接到db。

现在,在修复之后..每当错误的连接返回到连接池时,由于我上面所做的修复,它将被丢弃并且将不再使用。

现在我知道BasicDataSource在提供给应用程序之前先包装了连接,这样每当应用程序说con.close ..BasicDataSource就会知道不再使用该连接..它将负责将连接返回到池中,或者丢弃等

没有回答的问题:
但是,我不明白的是,当断开连接时,使应用程序神奇地将连接返回连接池[请注意,当连接异常退出时,不会调用con.close方法]。 BasicDataSource无法知道连接已关闭或存在?。有人可以指出我的代码吗?

我的整体理解与修复程序为何有效有关?

最佳答案

现在,我知道这是一个旧线程,但是它在Google搜索结果中的排名很高,所以我想我可以给个快速答案。有关配置BasicDataSource的更多信息,您应该参考“ DBCP配置”页面:http://commons.apache.org/proper/commons-dbcp/configuration.html

回答“ BasicDataSource如何知道何时放弃连接并需要将其返回到连接池?”这一“毫不费力”的问题。 (释义)...

org.apache.commons.dbcp.BasicDataSource能够通过使用Connection的包装器类来监视其提供的连接上的流量和使用情况。每次在连接上调用方法或从连接创建的任何语句时,实际上都是在调用包装器类,该包装器类实现接口或使用相同的方法扩展基类(万岁!)。这些自定义方法使DataSource可以知道Connection是否处于活动状态。

在BasicDataSource本身上,有一个名为“ removeAbandoned”的属性,还有另一个名为“ removeAbandonedTimeout”的属性,用于配置将未绑定连接返回到连接池的行为。

“ removeAbandoned”是一个布尔值,指示是否应将放弃的连接返回到池中。默认为“ false”。

“ removeAbandonedTimeout”是一个int,表示在认为连接被放弃之前应允许通过的非活动秒数。默认值为300(约5分钟)。

08-16 16:54