Hibernate operation: Cannot open connection; uncategorized SQLException for SQL [???]; SQL state [null]; error code [0]; Cannot get a connection, pool error Timeout waiting for idle object; nested exc

最近项目碰到如标题所示的异常,然后解决了,解决办法如下:

1.hibernate配置文件中增加:hibernate.connection.release_mode = after_statement

注意:hibernate.connection.release_mode: 指定Hibernate在何时释放JDBC连接. 默认情况下,直到Session被显式关闭或被断开连接时,才会释放JDBC连接. 对于应用程序服务器的JTA数据源, 你应当使用after_statement, 这样在每次JDBC调用后,都会主动的释放连接. 对于非JTA的连接, 使用after_transaction在每个事务结束时释放连接是合理的. auto将为JTA和CMT事务策略选择after_statement, 为JDBC事务策略选择after_transaction.

取值 on_close | after_transaction | after_statement | auto

2.在spring配置sessionFactory的hibernate相关属性配置行加入:

<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${dataSource.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
<!-- hibernate释放连接模式 -->
<prop key="hibernate.connection.release_mode">${hibernate.connection.release_mode}</prop>
</props>
</property>

3.然后再连接池(我用的是dpcp)数据源配置中加:

<!-- 配置dataSource 使用apache的dbcp数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${dataSource.driverClassName}" />
<property name="url" value="${dataSource.sjzk.url}" />
<property name="username" value="${dataSource.sjzk.username}" />
<property name="password" value="${dataSource.sjzk.password}" />
<property name="defaultAutoCommit" value="true"/>
<property name="initialSize" value="3" />
<property name="maxActive" value="300" />
<property name="maxIdle" value="50"/>
<property name="minIdle" value="1" />
<property name="maxWait" value="300" />
<!-- 为解决空连接超时问题 开始 -->
<!--removeAbandoned: 是否自动回收超时连接-->
<property name="removeAbandoned" value="true"/>
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->
<property name="removeAbandonedTimeout" value="180"/>
<!-- 在空闲连接回收器执行周期(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="10000"/>
<!-- 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 -->
<property name="numTestsPerEvictionRun" value="10"/>
<!-- 最小空闲时间-->
<property name="minEvictableIdleTimeMillis" value="10000"/>
<!-- 为解决空连接超时问题 结束 -->
</bean>

通过以上3处修改配置文件,重新发布,问题解决!

posted @ 2018-08-03 16:18  coding-in-java  阅读(1648)  评论(0编辑  收藏  举报