我已将 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/