项目部署在tomcat后每隔一段时间便会报错


Cause: java.sql.SQLException: Could not retrieve transation read-only status server
; SQL []; Could not retrieve transation read-only status server; nested exception is java.sql.SQLException: Could not retrieve transation read-only status server

开始以为是数据库事务级别过高,后来发现是每隔一天没操作便会丢失链接,于是找到原因


MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0/dbcp 连接池则以为该被断开的连接依然有效。在这种情况下,如果客户端代码向c3p0/dbcp 连接池请求连接的话,连接池就会把已经失效的连接返回给客户端,客户端在使用该失效连接的时候即抛出异常。

于是简单的修改了mysql的设置


#my.cnf
wait_timeout=31536000
interactive_timeout=31536000

但是这样改动的话wait_timeout太大了,会保留太多的无效链接,于是就从连接池上采取改动。在spring 连接池配置中加入定时检测,配置字段如下


maxWait="3000" 从池中取连接的最大等待时间,单位ms.
initialSize="10" 初始化连接
maxIdle="60" 最大空闲连接
minIdle="10" 最小空闲连接
maxActive="80" 最大活动连接 validationQuery = "SELECT 1" 验证使用的SQL语句
testWhileIdle = "true" 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.
testOnBorrow = "false" 借出连接时不要测试,否则很影响性能
timeBetweenEvictionRunsMillis = "30000" 每30秒运行一次空闲连接回收器
minEvictableIdleTimeMillis = "1800000" 池中的连接空闲30分钟后被回收,,默认值就是30分钟
numTestsPerEvictionRun="10" 在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值就是3. removeAbandoned="true" 连接泄漏回收参数,当可用连接数少于3个时才执行
removeAbandonedTimeout="180" 连接泄漏回收参数,180秒,泄露的连接可以被删除的超时值

配置后问题得到解决。

查看资料的过程中发现dbcp连接池是有两种的:Tomcat JDBC连接池与Apache Commons DBCP连接池。下面是两者的区别


1.Commons DBCP 1.x是单线程。在分配对象或对象返回的时候,会锁定全部连接池。(不适用于Commons DBCP 2.x) 2.Commons DBCP 1.x在逻辑cpu数量增加或者并发县城增加时,性能可能会变的很慢。高并发系统受到的影响会更加明显(不适用于Commons DBCP 2.x) 3.Commons DBCP 拥有60多个类。tomcat-jdbc-pool核心只有8个类,而未来如果需求变更,那么tomcat JDBC连接池会改动更少。 4.Commons DBCP使用静态接口,需要对应的jre需要对应的DBCP 版本,否则会抛出 NoSuchMethodException异常 5.Tomcat JDBC连接池无需为库本身添加额外线程,就能获取异步连接。 6.Tomcat JDBC连接池使用 javax.sql.PooledConnection接口获取底层连接 7.Tomcat JDBC连接池 可以防止饥饿。如果池变空,线程将等待一个连接。当连接返回时,池就将唤醒正确的等待线程。

配置tomcat-dbcp是在tomcat安装路径下配置的

配置Tomcat-DBCP


Tomcat默认使用的是DBCP数据库连接池,其实从本质上讲,Tomcat是利用Apache Commons DBCP来实现的,只不过把特定的功能集成到了tomcat-dbcp.jar包中,这个包在tomcat的lib里面. 1.配置context.xml 注意:(1)不是Context.xml,这个需要看你tomcat里面conf目录下是context.xml还是Context.xml,和这个一样就行. (2)这个配置即可以在${CATALINA_HOME}/conf/context.xml里配置,(CATALINA_HOME是你tomcat的安装目录) 也可以在${CATALINA_HOME}/webapps/项目名/META-INF/context.xml里,(项目名就是webapps下的一些目录名称, 比如:ROOT.如果ROOT下没有META-INF,那么创建一个就行,然后再在META-INF里创建文档context.xml)

如何将tomcat-dbcp数据源使用到项目中呢 有如下配置

在web项目的web.xml中加入资源引用:(可省略)


<resource-ref>
<description>JNDI DataSource</description>
<res-ref-name>jndi/testdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

启动的时候加载tomcat配置的JNDI 公开数据源,其中res-ref-name值要和server.xml 、context.xml的name值一致。


在web项目中配置spring数据源bean信息: <bean id="dataSource"class="org.springframework.jndi.JndiObjectFactoryBean">
<propertyname="jndiName">
<value>java:comp/env/jndi/testdb</value>
</property>
</bean>
直接替换项目WEB-INF/conf/data-access-config.xml文件中 beanid=”dataSource” 的节点即可使用

但是由于考虑到使用jndi配置数据源对已有程序影响较大,所以最后只是升级了common-dbcp版本来获取更高的性能。以上就是解决这个问题大致的过程。
参考:
https://blog.csdn.net/lzwglor...
http://elf8848.iteye.com/blog...
https://blog.csdn.net/Jacabe/...
https://blog.csdn.net/acoolpe...
https://blog.csdn.net/u011487...

原文地址:https://segmentfault.com/a/1190000017065607

tomcat7使用dbcp连接池遇到的坑的更多相关文章

  1. DBCP连接池TestOnBorrow的坑

    生产环境连接池TestOnBorrow设置为false,导致有时获取的连接不可用.分析如下: TestOnBorrow=false时,由于不检测池里连接的可用性,于是假如连接池中的连接被数据库关闭了, ...

  2. DBCP连接池介绍

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...

  3. DBCP连接池原理分析及配置用法

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...

  4. 【转】DBCP连接池原理分析

    ---------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 JDBC 3. DB ...

  5. DBCP连接池原理分析(转载)

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...

  6. DBCP连接池简介

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

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

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

  8. DBCP连接池使用问题

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

  9. JNDI和在tomcat中配置DBCP连接池 元数据的使用 DBUtils框架的使用 多表操作

    1 JNDI和在tomcat中配置DBCP连接池 JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.namin ...

随机推荐

  1. Spring Security 使用Ajax登陆无法跳转页面解决方法

    使用Security的朋友都知道,使用Security后,不再需要我们自己过多的(还需要写少量代码)写登陆的逻辑,只需要自己在html的登陆表单上面定义好输入框name为:username和passw ...

  2. 【POJ - 3190 】Stall Reservations(贪心+优先队列)

    Stall Reservations 原文是English,这里直接上中文吧 Descriptions: 这里有N只 (1 <= N <= 50,000) 挑剔的奶牛! 他们如此挑剔以致于 ...

  3. UML 图中类之间的关系:依赖,泛化,关联,聚合,组合,实现

    http://www.uml.org.cn/oobject/201211231.asp 1. 关联 一个类作为另外一个类的变量:在UML类图中,用实线连接有关联关系的对象所对应的类 2.聚合 表示整体 ...

  4. 跟我一起玩Win32开发(2):完整的开发流程

    上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上 ...

  5. RHEL6.5---LVS(IP-TUN)

    实验环境: 主机名 IP  所需软件 master eth0==>192.168.30.160(RIP) eth0:1==>192.168.30.130(VIP) ipvsadm node ...

  6. FPGA内部RAM的初始化

    Altera的RAM初始化文件格式是mif和hex. QuartusII自带的RAM初始化工具很方便产生初始化文件. Xilinx的RAM初始化文件格式是coe, 在vivado中软件会将coe文件变 ...

  7. (译文)IOS block编程指南 4 声明和创建blocks

    Declaring and Creating Blocks (声明和创建blocks) Declaring a Block Reference (声明一个block引用) Block variable ...

  8. (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一

    http://blog.csdn.net/yerenyuan_pku/article/details/52888808 前面我们已经集成了Spring4.2.5+Hibernate4.3.11这两个框 ...

  9. Android(java)学习笔记186:多媒体之视频播放器

    1. 这里我们还是利用案例演示视频播放器的使用: (1)首先,我们看看布局文件activity_main.xml,如下: <RelativeLayout xmlns:android=" ...

  10. Android(java)学习笔记176: 远程服务的应用场景(移动支付案例)

    一. 移动支付:       用户需要在移动终端提交账号.密码以及金额等数据 到 远端服务器.然后远端服务器匹配这些信息,进行逻辑判断,进而完成交易,返回交易成功或失败的信息给移动终端.用户提交账号. ...