一套S2SH的应用,现用单线程,连续发1000个请求,用的DBCP链接池,结果报数据库链接不够用:
ERROR [org.hibernate.util.JDBCExceptionReporter] - Cannot get a connection, pool error Timeout waiting for idle object
在JAVA加上LOG:
log.info("active: " + dataSource.getNumActive() + " (max: "
+ dataSource.getMaxActive() + ") " + "idle: " + dataSource.getNumIdle()
+ "(max: " + dataSource.getMaxIdle() + ")");
结果显示为:
active: 25 (max: 100) idle: 0(max: 30)
active的数量一直增加,但idle的数量一直为0。当程序向链接池要链接的时候,如果池没有,就会新建一个,active数就会加1,关闭链接后,链接会返回池,idle数加1。idle为0则表示池里没有链接。
这样说明链接一直在创建,没有关闭放回池里。但链接是由SPRING和HIBERNATE管理的,代码中没有关闭链接的语句。之后试了N多配置,都还没解决,如增加maxActive数等。最后,加上这一行,问题才终于解决:
<prop key="hibernate.connection.release_mode">after_transaction</prop>
这里默认值是auto,如果是用JTA事务才适用,如果是JDBC事务,就只能用after_transaction。
这样每次事务结束后,就会关闭链接返回链接池。