java - DBCP Tomcat 连接池 removeAbandoned 不工作

标签 java apache tomcat profiling connection-pooling

我已将 Tomcat DBCP 配置为:

<Resource
name="jdbc/myoracle"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
username="abc"
password="abc"
maxActive="20"
maxIdle="4"
minIdle="0"
maxWait="4"
removeAbandoned="true"
logAbandoned="true"
removeAbandonedTimeout="3"
/> 

我不知道,我已经定义了上面的设置是否正确。 我正在使用 struts 2,一个网页有菜单链接,它正在调用操作类,我在其中执行所有数据库操作并打开/关闭来自/到池的连接。 问题是,如果我连续不断地点击菜单链接 40-50 次,连接会增加,因为单击鼠标然后等待响应,一切正常(即不增加连接)。

只有连续疯狂点击而不等待单一响应才能使连接突然上升并且不会回到初始状态。 如果我的连接在操作类中的某处泄漏,那么为什么它总是在单击鼠标、等待响应然后再单击鼠标时一直运行良好?

(连续点击相同的菜单链接结果:) 正如我将 maxActive 定义为 20,连接数将持续到 24(我记得)并且在该池耗尽之后,即新连接/请求无限期等待以从耗尽的池中获取连接。

我的疑问是,为什么 removeAbandoned 没有关闭连接 因为我指定了 removeAbandonedTimeout=3。 如果我假设我有连接内存泄漏或者我没有故意关闭任何连接,那么removeAbandoned 是否会杀死所有打开的连接

还是我的DBCP设置或者上面的参数有问题? 请帮我解决这个问题。

最佳答案

我会说 maxWait 参数的值太小了。根据documentation ,它的计量单位是毫秒。分配完所有可用连接后,在您的情况下它将仅等待 4 毫秒并抛出异常。

此外,我建议增加 minIdle 参数值,这样在任何时候都会有多个“准备好的”连接可供使用。当然,之后您可能需要额外增加 maxIdle 参数值。

至于removeAbandonedTimeout参数,请确保其值大于运行任何数据库操作所需的秒数。

还有一件事要记住,将 logAbandoned 设置为 true 会给连接借用过程增加一些开销。

关于java - DBCP Tomcat 连接池 removeAbandoned 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14404271/

相关文章:

java - 在 Tomcat 上部署 Java Play 应用程序?

java - Hibernate 读行锁定

java - 使用 Hibernate 的高 GC 负载

java - 停用 optaplanner 规则

java - Centos 64 位和 openjdk 7 上的堆转储错误

apache - centos 5.5如何设置定时启停httpd和mysql

apache - 使用 freeRadius 和 Apache 进行单点登录?

java - 如何使用 Jackson 编码包含未知数量 KV 对的 JSON 对象列表

php - 如何在 Linux Fedora 上的 Apache 中启用 PHP?

java - 反编译项目在tomcat上运行