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