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
  • 相关阅读:
    Q15格式表示负小数
    音频算法处理笔试面试题
    有符号和无符号之间的转化
    PE5 Smallest multiple
    PE3 Largest prime factor(最大素数因子)
    PE2 Even Fibonacci numbers(最大菲波那列偶数)
    PE 4 Largest palindrome product(最大回文)
    PE1 Multiples of 3 and 5
    Codevs高精度入门(减法、加法和乘法)解题报告
    计算机网络学习笔记(二) 计算机网络结构
  • 原文地址:https://www.cnblogs.com/ninicwang/p/9001064.html
Copyright © 2011-2022 走看看