我已将 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设置或以上参数有问题吗? 请帮我解决这个问题。
答案 0 :(得分:2)
我会说maxWait
参数的值太小。根据{{3}},其度量单位是毫秒。当分配了所有可用的连接时,在你的情况下,它将只等待4毫秒并将抛出异常。
另外,我建议增加minIdle
参数值的值,以便始终可以使用几个“准备好”的连接。当然,您可能需要在之后另外增加maxIdle
参数值的值。
对于removeAbandonedTimeout
参数,请确保其值 运行任何数据库操作所需的秒数。
要记住的另一件事是将logAbandoned
设置为true会给连接借用过程增加一些开销。