【发布时间】:2011-05-05 21:11:51
【问题描述】:
我修复了一些与我们使用 BasicDataSource 的方式相关的错误,尽管我了解其中的一部分,但我仍有一些问题没有得到解答 :)
问题: 数据库故障后,应用程序无法自动连接到数据库。
应用程序正在使用org.apache.commons.dbcp.BasicDataSource class 作为与 Oracle 数据库的 JDBC 连接的 TCP 连接池。
修复: 经过一番研究,我发现在 BasicDataSource testOnBorrow 和 testOnreturn 没有设置。我提供了验证查询来测试连接。这解决了问题
池中的最大连接数设置为 1
我的理解: 连接池会将连接移交给应用程序。 我认为正在发生的是应用程序 MAGICALLY 在数据库崩溃时将错误集合返回到池中。现在,由于 Pool 不知道它是否是一个错误的连接,它会在下次需要它时将相同的连接移交给应用程序,从而导致应用程序不会自动重新连接到 db。
现在,在修复之后.. 每当错误的连接返回到连接池时,由于我在上面所做的修复,它将被丢弃并且不会再次使用。
现在我知道 BasicDataSource 在提供给应用程序之前包装了连接,这样每当应用程序说 con.close ..BasicDataSource 就会知道该连接不再被使用..它会负责将连接返回到池或丢弃等。
未回答的问题: 但是我不明白是什么让应用程序 MAGICALLY 在连接中断时将连接返回到连接池[请注意,当连接不正常退出时不会调用 con.close 方法]。 BasicDataSource 无法知道连接已关闭或存在?有人可以指点我为此编写代码吗?
我的总体理解是为什么修复有效??
【问题讨论】:
标签: apache jdbc apache-commons apache-commons-dbcp