Java DBCP Tomcat连接池RemoveBandoned不工作

Java DBCP Tomcat连接池RemoveBandoned不工作,java,apache,tomcat,profiling,connection-pooling,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

我已将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,一个网页有菜单链接,它调用action类,在这里我执行所有的db操作,打开/关闭从池到池的连接。 问题是,如果我持续不断地点击菜单链接,比如说40-50次,连接就会增加,因为单击鼠标一次,然后等待响应,就可以了(即不增加连接)

只有连续疯狂点击而不等待单个响应,才能使连接突然上升,而不会回到初始状态。 若我的连接在action类中的某个地方泄漏了,那个么为什么每次单击鼠标,等待响应,然后再单击另一个鼠标,它总是运行良好呢

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

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

或者我的DBCP设置或以上参数是否有任何错误?
请帮我整理一下

我认为
maxWait
参数的值太小了。根据,它的度量单位是毫秒。当分配了所有可用连接时,在您的情况下,它只会等待4毫秒并引发异常

另外,我建议增加
minIdle
参数值,以便在任何时候都可以使用几个“准备好的”连接。当然,之后可能需要额外增加
maxIdle
参数值

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


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

我尝试稍微增加一些值,但结果仍然是一样的。我知道RemoveBandonedTimeout值需要大于运行任何db操作以避免连接中断所需的秒数。但RemoveBandonedTimeout=“3”难道不意味着关闭连接/甚至收回对池的运行模式连接吗?为什么连续单击50-60次鼠标后,连接池会耗尽并停止分配更多连接?你说的“稍微增加一点值”是什么意思?问题是,您的所有值都比默认值少得多(removeAbandonedTimeout=60,maxActive=100,maxIdle=maxActive=100,minIdle=initialSize=10,maxWait=30000)。您是否有任何特定的理由使用比默认值小得多的值?总之,如果您需要更多的连接,为什么不分配更多?我将分配多少连接,所有的连接都将耗尽,因为在我的代码中有一些连接泄漏。。为什么RemoveBandoned=“true”在这种情况下不关闭连接?也许这只是因为没有理由将连接标记为已放弃并删除它们?阅读文档,看起来您并没有真正理解RemoveBandoned参数的含义。另外,根据NevictionRunsmillis的意思,获取一个战利品。