我希望你能帮助我,我在生产环境中遇到错误... 我正在使用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配置。
我阅读了有关该例外的相关帖子,但主要是问题是连接泄漏,但在我的情况下,我很确定我没有。
感谢您的帮助......
答案 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