【问题标题】:MySql exception Cannot get a connection, pool error Timeout waiting for idle objectMySql异常无法获取连接,池错误超时等待空闲对象
【发布时间】:2012-08-01 12:34:09
【问题描述】:

我希望你能帮助我,我在生产环境中遇到错误...... 我正在运行带有 MySql 连接器版本 5.1.2 和 Apache 公共连接池版本 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: 无法获取连接,池错误 Timeout waiting for idle object

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

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

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

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

感谢您的帮助....

【问题讨论】:

    标签: mysql spring apache jdbc database-connection


    【解决方案1】:

    您的一个 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

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2013-12-22
      • 1970-01-01
      • 2013-10-01
      • 2013-12-12
      • 2012-04-02
      相关资源
      最近更新 更多