3

我修复了一些与我们使用 BasicDataSource 的方式相关的错误,虽然我理解其中的一部分,但我仍然有一些问题没有得到解答:)

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

应用程序使用org.apache.commons.dbcp.BasicDataSource 类作为 TCP 连接池,用于与 Oracle db 的 JDBC 连接。

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

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

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

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

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

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

我的整体理解连接为什么修复工作?

4

2 回答 2

4

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

回答“BasicDataSource 如何知道连接何时被放弃并需要返回连接池?”的“未回答”问题。(转述)...

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

在 BasicDataSource 本身上,有一个名为“removeAbandoned”的属性和另一个名为“removeAbandonedTimeout”的属性,用于配置将放弃的连接返回到连接池的这种行为。

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

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

于 2013-11-07T18:55:25.150 回答
0

查看放弃连接的测试,似乎当请求新连接时池中的所有连接都“正在使用”时,“正在使用”的连接会被测试放弃(它们维护上次使用时间的时间戳) .

请参见BasicDataSource#setRemoveAbandoned(boolean)BasicDataSource#setRemoveAbandonedTimeout(int)

无论您的连接池在关闭废弃连接方面有多聪明,您都应始终确保在 finally 块中关闭每个连接,例如:

Connection conn = getConnection();
try {
    ... // perform work
} finally {
    conn.close();
}

或者使用其他方式,例如Apache DBUtils

于 2011-02-01T20:32:47.320 回答