1

我已将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 设置或以上参数有什么问题?请帮我解决这个问题。

4

1 回答 1

2

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

另外,我建议增加minIdle参数值的值,以便始终有几个“准备好的”连接可供使用。当然,之后您可能需要额外增加maxIdle参数值的值。

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

要记住的另一件事是,设置logAbandoned为 true 会增加连接借用过程的一些开销。

于 2013-01-18T17:58:35.387 回答