当我们在prod服务器上上传我们的应用程序时,我们遇到了奇怪的行为 - 有时它停止从数据库中获取数据,好像逻辑和一切都正确并且本地版本工作正常。远程调试后,我们发现GenericObjectPool阻塞了线程。经过一段时间的搜索,我们发现了适合我们问题的情况。 当填充8个连接(默认值)时,池刚用尽,默认情况下,它的行为设置为在耗尽时阻塞线程。
这是我的BasicDataSource
的datamodel-context.xml配置<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="url_to_db"/>
<property name="username" value="username"/>
<property name="password" value="12211"/>
<property name="defaultAutoCommit" value="false"/>
<property name="poolPreparedStatements" value="true"/>
<property name="initialSize" value="10"/>
<property name="maxIdle" value="5"/>
<property name="testOnBorrow" value="true"/>
<property name="logAbandoned" value="true"/>
</bean>
在这里找到两个解决方案 - 增加最大活动数量或更改池的行为。 第一个似乎很简单 - 将BasicDataSource中的属性maxActive设置为某个数字(如果我误会,请纠正我)。这种方式是不需要的,因为我们无法知道可能的同时连接的确切数量。
决定尝试第二种方式 - 将行为更改为WHEN_EXHAUSTED_GROW。 那么有没有办法配置spring default pool来改变它的whenOhaustedAction行为?或者我应该为BasicDataSource定义自己的连接池?如果是这样,请提供示例吗? 我感谢任何意见或建议。感谢。