c3p0、dbcp、tomcat jdbc pool 连接池区别(推荐使用jdbc pool)

本文介绍了Tomcat JDBC Pool相较于dbcp和c3p0的优势,如高并发性能、异步获取连接等,并提供了解决MySQL8小时无请求自动断开连接问题的方案,包括修改数据库配置、减少连接池连接生存周期和定期检查连接有效性。推荐使用Tomcat JDBC Pool作为连接池实现。
摘要由CSDN通过智能技术生成

查看资料,得知dbcp和c3p0都是单线程的,在高并发的环境下性能会非常低下,
决定换用tomcat自带的jdbc-pool,关于jdbc-pool的项目介绍。
区别参考链接:http://www.open-open.com/lib/view/open1329182303124.html

   <!--  class="org.apache.tomcat.dbcp.dbcp.BasicDataSource" -->
    <!--  class="org.springframework.jdbc.datasource.DriverManagerDataSource" -->
       <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" parent="c3p0DataSource">

Tomcat 在 7.0 以前的版本都是使用 commons-dbcp 做为连接池的实现,但是 dbcp 饱受诟病,原因有:

dbcp 是单线程的,为了保证线程安全会锁整个连接池
dbcp 性能不佳
dbcp 太复杂,超过 60 个类
dbcp 使用静态接口,在 JDK 1.6 编译有问题
dbcp 发展滞后
因此很多人会选择一些第三方的连接池组件,例如 c3p0 , bonecp, druid (@wenshao ) 等。

为此,Tomcat 从 7.0 开始引入一个新的模块:Tomcat jdbc pool

tomcat jdbc pool 近乎兼容 dbcp ,性能更高
异步方式获取连接
tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的日志框架
使用 javax.sql.PooledConnection 接口获取连接
支持高并发应用环境
超简单,核心文件只有8个,比 c3p0 还
更好的空闲连接处理机制
支持 JMX
支持 XA Connection
tomcat jdbc pool 的优点远不止这些,详情请看这里。

tomcat jdbc pool 可在 Tomcat 中直接使用,也可以在独立的应用中使用。

推荐使用
[html] view plain copy print?

<!-- JDBC连接池 、数据源 -->  

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">  
  <property name="driverClassName" value="${jdbc.driverClassName}" />  
  <property name="url" value="${jdbc.url}" />  
  <property name="username" value="${jdbc.username}" />  
  <property name="password" value="${jdbc.password}" />  
  <property name="testWhileIdle" value="true" />  
  <property name="testOnBorrow" value="true" />  
  <property name="testOnReturn" value="false" />  
  <property name="validationQuery" value="SELECT 1" />  
  <property name="validationInterval" value="30000" />  
  <property name="timeBetweenEvictionRunsMillis" value="30000" />  
  <property name="maxActive" value="100" />  
  <property name="minIdle" value="2" />  
  <property name="maxWait" value="10000" />  
  <property name="initialSize" value="4" />  
  <property name="removeAbandonedTimeout" value="60" />  
  <property name="removeAbandoned" value="true" />  
  <property name="logAbandoned" value="true" />  
  <property name="minEvictableIdleTimeMillis" value="30000" />  
  <property name="jmxEnabled" value="true" />  
</bean>  

引入Maven依赖:
[html] view plain copy print?在CODE上查看代码片派生到我的代码片

org.apache.tomcat
tomcat-jdbc
7.0.29


org.apache.tomcat
tomcat-juli
7.0.29

tomcat-dbcp与commons-dbcp有什么区别
The default database connection pool implementation in Apache Tomcat relies on the libraries from the Apache Commons project. The following libraries are used:
Commons DBCP
Commons Pool
These libraries are located in a single JAR at $CATALINA_HOME/lib/tomcat-dbcp.jar. However, only the classes needed for connection pooling have been included, and the packages have been renamed to avoid interfering with applications.
以上是tomcat7.x的帮助文档,大意是tomcat-dbcp.jar包含了commons-dbcp和Commons Pool的内容,当然也只仅仅包含了需要数据库连接的部分,而不是全部。

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

基本问题解决
项目环境:
Java Web项目框架为spring MVC+JPA,使用c3p0连接池,发布环境为Tomcat 7

错误描述:
项目运行一段时间(大概几个小时)之后访问时会出现第一次访问报错,再次访问正常的现象,且多次出现此问题。

报错日志:

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: org.hibernate.TransactionException: JDBC begin transaction failed:   
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:428)  
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:372)  
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:417)  
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:255)  
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)  
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)  
    at com.appcarcare.cube.service.UserService
EnhancerByCGLIB
a4429cba.getUserDao(<generated>)  

    at com.appcarcare.cube.servlet.DataCenterServlet$SqlTimer.connectSql(DataCenterServlet.java:76)  
    at com.appcarcare.cube.servlet.DataCenterServlet$SqlTimer.run(DataCenterServlet.java:70)  
    at java.util.TimerThread.mainLoop(Timer.java:555)  
    at java.util.TimerThread.run(Timer.java:505)  
Caused by: javax.persistence.PersistenceException: org.hibernate.TransactionException: JDBC begin transaction failed:   
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)  
    at org.hibernate.ejb.AbstractEntityManagerImpl
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值