当我们在 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默认池来改变它的whenExhaustedAction行为呢?还是应该为 BasicDataSource 定义自己的连接池?如果是这样,请您提供示例吗?我感谢任何意见或建议。谢谢。