MySql异常无法获取连接,池错误超时等待空闲对象

时间:2012-08-01 12:34:10

标签: mysql spring apache jdbc database-connection

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

我的春季数据源配置:

<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:无法获取连接,池错误超时等待空闲对象

起初我认为存在连接泄漏,在运行netstat来检查数据库连接后,我看到每个事情都得到妥善管理,并且连接数量保持良好,因为它应该比maxActive值低得多......

另一个奇怪的事情是,在每个当前时刻,该主应用程序的3个实例都在运行,每个实例都有不同的业务逻辑配置,但每个数据源配置相同,我只得到一个例外例如,另外两个正常地从DB获取连接。

除了从MySql数据库汇集连接的Java实例外,还有更多与DB通信的服务,但与DB的总连接数远低于我的MySql配置。

我阅读了有关该例外的相关帖子,但主要是问题是连接泄漏,但在我的情况下,我很确定我没有。

感谢您的帮助......

1 个答案:

答案 0 :(得分:0)

你的一个java实例失去了与数据库的连接,但是BasicDataSource处理了这个问题,但是你已经指定了maxWait属性值1000,所以在抛出异常之前,池只会等待1000毫秒才能返回一个连接删除那个maxwait标签或者为indefinete wait指定-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