0

我希望你能帮助我,我在生产环境中遇到错误......我正在运行带有 MySql 连接器版本 5.1.2 和 Apache commons 连接池版本 1.3 的 Spring 主应用程序 java 1.7。

我的spring数据源配置:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${db.driverClassName}" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
        <property name="maxActive" value="100" />
        <property name="maxWait" value="1000" />
        <property name="poolPreparedStatements" value="true" />
    </bean>

运行几个小时后,出现异常 org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

起初我以为有连接泄漏,在运行 netstat 检查数据库连接后,我看到每件事都得到了很好的管理,并且连接量保持得很好,因为它应该比 maxActive 值低得多......

更奇怪的是,在每个当前时刻,该主应用程序的 3 个实例都在运行,每个实例的业务逻辑配置都不同,但每个实例的数据源配置都相同,问题是我只得到一个实例的异常,而另外两个像往常一样从数据库获取连接。

除了我的 Java 实例汇集了来自 MySql 数据库的连接之外,还有更多与数据库通信的服务,但是在我的 MySql 配置中,与数据库的总连接数要低得多。

我阅读了有关该异常的相关帖子,但主要问题是连接泄漏,但就我而言,我很确定我没有任何问题。

谢谢你的帮助....

4

1 回答 1

0

您的一个 java 实例失去了与数据库的连接,但 BasicDataSource 处理此问题,但由于您已指定 maxWait 属性值 1000,因此池将仅等待 1000 毫秒以返回连接,然后抛出异常删除该 maxwait 标记或指定 - 1 值表示无限等待。

您应该使用 validationquery 属性来验证来自该池的连接

所以你的 BasicDataSource 缺少一些配置所以添加下面的配置属性你的问题将得到解决

<property name="testWhileIdle" value="true" /> 
<property name="validationQuery"><value>SELECT 1</value></property>
<property name="testOnBorrow"><value>true</value></property>

有关更多配置,请参阅此链接http://commons.apache.org/proper/commons-dbcp/configuration.html

于 2013-07-19T12:11:37.303 回答