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

 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

做到让DBCP连接池不超时的更多相关文章

  1. DBCP连接池使用问题

    问题现象: 启动应用,访问无压力,一切正常,一段时间过后,应用访问异常. 问题分析: 1.web容器线程爆满,拒绝服务.由于应用并发量大,线程响应时间长增加,线程池连接数逐步递增直到爆满,导致应用拒绝 ...

  2. DBCP连接池的使用

    1.新建工程 2.导入commons-dbcp commons-logging commons-pool这三个包 3.创建dbcpconfig.properties的文件 实例如下 #连接设置 dri ...

  3. 使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案

    转自:http://blog.csdn.net/wangfayinn/article/details/24623575 c3p0数据库连接池mysql8小时 目录(?)[-] 基本问题解决 项目环境 ...

  4. 常见的DBCP连接池配置

    项目中使用mybatis出现一个问题,项目刚启动时,查询项目列表是ok的,过上一段时间之后,再次查询项目列表,查询失败,初步判断是因为mysql的连接问题,最后查阅资料,发现是连接池中的连接失效,导致 ...

  5. DBCP 连接池

    DBCP数据源 DBCP 是 Apache 软件基金组织下的开源连接池实现 导入maven包: <!-- dbcp连接池 --> <dependency> <groupI ...

  6. 关于 Mybatis的原生连接池 和 DBCP 连接池

    一 遇到的问题:  项目用的play框架,数据库DB2, 持久化框架是Mybatis, 连接池用的是Mybatis原生的,遇到的问题是:有时候抛出如下异常: play.api.UnexpectedEx ...

  7. 使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方式

    本文提供了对c3p0与DBCP连接池连接MySql数据库时. 8小时内无请求自己主动断开连接的解决方式.首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方式. ...

  8. DBCP连接池简介

    DBCP连接池简介 1.数据库连接基础 数据库连接池基础主要包括以下三个方面的内容:数据库连接池的基本概念.数据库连接池的工作原理.Java开源的连接池.下面将从这三个方面一一介绍: (1)数据库连接 ...

  9. 采用DBCP连接池技术管理连接

    DBCP的使用步骤步骤一:导包,使用第三方的道具,必须导入相应的jar包. 一般需要导入两个jar包: -commons-dbcp-1.x.jar包 -commons-pool-1.x.x.jar包 ...

随机推荐

  1. 知识点:Mysql 基本用法之函数

    函数 MySQL中提供了许多内置函数 例如: sql 内置函数: 一.数学函数 ROUND(x,y) 返回参数x的四舍五入的有y位小数的值 RAND() 返回0到1内的随机值,可以通过提供一个参数(种 ...

  2. ECMAScript 6 学习总结

    1.什么是ES6? 简单的说 ES6 的第一个版本,在2015年6月发布了,正式名称就是<ECMAScript 2015标准>(简称 ES2015)在2016年6月,小幅修订的<EC ...

  3. Avalon Master 外设

  4. 44个Java代码性能优化总结

    https://blog.csdn.net/xiang__liu/article/details/79321639 ---稍后有时间整理

  5. win7获取system32所有权

    (1)cmd ->  takeown /f  C:\Windows\System32* /r (2)右击system32文件夹属性 -> 安全 ->高级 ->所有者 —改为当前 ...

  6. upcast 做了什么操作

    把子类中仅仅继承而来的成员,赋值给父类. 但是,不会改变虚表!因为这个obj的类型没变. #include <stdio.h> using namespace std; class A{ ...

  7. 【原】The Linux Command Line - Manipulation Files And Directories

    cp - Copy Files and directories mv - move/rename files and directories mkdir - create directories rm ...

  8. Sqlite安装教程

    Sqlite下载页面:http://www.sqlite.org/download.html Windows安装 需要下载 sqlite-tools-win32-*.zip 和 sqlite-dll- ...

  9. C# WinForm窗体及其控件的自适应

    3步骤: 1.在需要自适应的Form中实例化全局变量   AutoSizeFormClass.cs源码在下方 AutoSizeFormClass asc = new AutoSizeFormClass ...

  10. 4、python常用基础类型介绍

    1.字符串 str 描述性质的一种表示状态的例如名字 word='helloworld' print(type(word),word) <class 'str'> helloworld2. ...