• 做到让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
  • 相关阅读:
    Linux的僵尸进程及其解决方法
    描述linux系统从开机到登陆界面的启动过程
    __weak、__strong这样的关键词和weak、strong有哪些区别
    选择器(UIPickerView)
    UITableView 滚动流程性优化
    几种设置UITableView的cell动态高度的方法
    强大的Core Image(教你做自己的美图秀秀))
    iOS UIBezierPath类 介绍
    Quartz 2D编程指南- PDF文档的创建、显示及转换
    Quartz 2D编程指南(4) - 颜色和颜色空间
  • 原文地址:https://www.cnblogs.com/ninicwang/p/9001064.html
Copyright © 2020-2023  润新知