zoukankan      html  css  js  c++  java
  • 做到让DBCP连接池不超时

    前些天部署了一个项目,但每次隔一段时间打开都会报如下所示的错误:

     javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed:  
    百度一下,原来是数据库连接超时。MySQL默认连接存活时长为28800秒,即8小时。如果在wait_timeout期间内,数据库连接(java.sql.Connection)一直处于等待状态,MySQL就将该连接关闭。此时,DBCP数据库连接池仍然合法地持有该连接,当用该连接来进行数据库操作时,就报上述错误。
    解决方法有三个:
    法一:设置一个较大的wait_timeout值。 
    wait_timeout的最大值分别是24天/365天(windows/linux,可通过修改my.ini或my.cnf,将wait_timeout配置一个较大值,这样可暂时解决这个问题。但如果连接等待超过配置时长,还是会有这个问题,这个办法不能根本上解决问题。
    法二:在应用的数据库连接配置上想办法,url增加autoReconnect=true,可惜对mysql5以上版本无效,这个办法也不能根本解决问题。
    法三:在连接池配置文件上下功夫。 
    BasicDataSource有testOnBorrow、testOnReturn、testWhileIdle属性,意义分别是取得、返回对象和空闲时,是否进行对象有效性检查,默认都是False关闭状态。只要都设置为True,并提供validationQuery语句即可保证数据库连接始终有效。
    testOnBorrow=true
    testOnReturn=true
    testWhileIdle=true
    validationQuery=SELECT 1 FROM DUAL
    注:在利用法三解决问题时,如果配置文件里配置的是dbcp所依赖的jar包(class="org.apache.commons.dbcp.BasicDataSource"),则会报如下所示的错误:
    Error creating bean with name 'dataSource' defined in class path resource [applicationContext.xml]: Invalid property 'testOnBorrow' of bean class [org.apache.commons.dbcp.BasicDataSource]:
    经过在代码里面查看org.apache.commons.dbcp.BasicDataSource类里面没有setTestOnBorrow这个方法,在导入包的时候发现有tomcat自带的dbcp包(org.apache.tomcat.dbcp.dbcp.BasicDataSource),它里面有setTestOnBorrow这个方法,索性在配置文件里写入tomcat自带的dbcp包。经过试验发现没有再报错。而且数据库不会有连接超时的错误出现。
     
    参考:https://blog.csdn.net/hunger_wang/article/details/55224726
  • 相关阅读:
    Note/Solution 转置原理 & 多点求值
    Note/Solution 「洛谷 P5158」「模板」多项式快速插值
    Solution 「CTS 2019」「洛谷 P5404」氪金手游
    Solution 「CEOI 2017」「洛谷 P4654」Mousetrap
    Solution Set Border Theory
    Solution Set Stirling 数相关杂题
    Solution 「CEOI 2006」「洛谷 P5974」ANTENNA
    Solution 「ZJOI 2013」「洛谷 P3337」防守战线
    Solution 「CF 923E」Perpetual Subtraction
    KVM虚拟化
  • 原文地址:https://www.cnblogs.com/ninicwang/p/9001064.html
Copyright © 2011-2022 走看看