`
hanqunfeng
  • 浏览: 1543316 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C3P0配置实战

阅读更多

C3P0: 一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

 

默认情况下(即没有配置连接池的情况下),Hibernate会采用内建的连接池。但这个连接池性能不佳,因此官方也只是建议仅在开发环境下使用。Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool。

 

这里说一下为什么一定要使用C3P0吧:

1)hibernate官网推荐

2)  解决数据库重启后tomcat在不需要重启的情况下即可重新获得数据连接的问题。

 

下载:http://www.mchange.com/projects/c3p0/index.html

 

这里说一下如何配置,网上其实有好多,我只是根据项目需要整理了一下,一共3种,大家根据需要来配置。

 

一。JNDI(项目比较常用,最简单,与代码无关联)

1)在tomcat或者项目中引入最新版的C3P0的JAR包(我是用的是c3p0-0.9.2.1.jar)

如果启动时报类没有找到:Caused by: java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector,

则需要加入mchange-commons-java-0.2.3.4.jar。

2)修改tomcat中的数据源配置,如下:

<Resource name="jdbc/dbsource"   
            type="com.mchange.v2.c3p0.ComboPooledDataSource"  
            maxPoolSize="50" minPoolSize="5" acquireIncrement="2"  initialPoolSize="10"  maxIdleTime="60"
            factory="org.apache.naming.factory.BeanFactory"  
            user="xxxx" password="xxxx"  
            driverClass="oracle.jdbc.driver.OracleDriver"  
            jdbcUrl="jdbc:oracle:thin:@192.168.x.x:1521:orcl" 
            idleConnectionTestPeriod="10" /> 

参数说明:

(1)idleConnectionTestPeriod

当数据库重启后或者由于某种原因进程被杀掉后,C3P0不会自动重新初始化数据库连接池,当新的请求需要访问数据库的时候,此时会报错误(因为连接失效),同时刷新数据库连接池,丢弃掉已经失效的连接,当第二个请求到来时恢复正常。

C3P0目前没有提供当获取已建立连接失败后重试次数的参数,只有获取新连接失败后重试次数的参数(acquireRetryAttempts【默认为30】 )。

要解决此问题,可以通过设置idleConnectionTestPeriod【默认为0,表示不检查 】参数折中解决,该参数的作用是设置系统自动检查连接池中连接是否正常的一个频率参数,时间单位是秒 。

 

(2)acquireIncrement

当连接池中的的连接耗尽的时候c3p0一次同时获取的连接数,也就是说,如果使用的连接数已经达到了maxPoolSize,c3p0会立即建立新的连接。

 

(3)maxIdleTime

另外,C3P0默认不会close掉不用的连接池,而是将其回收到可用连接池中,这样会导致,连接数越来越大,所以需要设置maxIdleTime【默认0,表示永远不过期】,单位是秒,maxIdleTime表示idle状态的connection能存活的最大时间。

 

3)项目中正常引入这个数据源即可,代码不需要任何修改

 

 

二。Hibernate(spring+hibernate):不推荐,完全可以使用第一种和第三种方法代替。

1)项目中引入C3P0的JAR

2)修改Hibernate中的配置(我使用的是Spring+Hibernate),如下:

<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="mappingLocations" value="${hibernate.mapping.locations}" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					${hibernate.dialect}
				</prop>
				<prop key="hibernate.show_sql">
					${hibernate.show_sql}
				</prop>
				<prop key="hibernate.use_sql_comments">
					${hibernate.use_sql_comments}
				</prop>
				
				<prop key="hibernate.connection.provider_class">
					org.hibernate.connection.C3P0ConnectionProvider
				</prop>
				<!--连接池的最小连接数 -->
				<prop key="hibernate.c3p0.min_size">
					5
				</prop>
				<!--最大连接数 -->
				<prop key="hibernate.c3p0.max_size">
					50
				</prop>
				<!--连接超时时间 -->
				<prop key="hibernate.c3p0.timeout">
					120
				</prop>
				<!--statemnets缓存大小 -->
				<prop key="hibernate.c3p0.max_statements">
					100
				</prop>
				<!--每隔多少秒检测连接是否可正常使用 -->
				<prop key="hibernate.c3p0.idle_test_period">
					120
				</prop>
				<!--当池中的连接耗尽的时候,一次性增加的连接数量,默认为3 -->
				<prop key="hibernate.c3p0.acquire_increment">
					2
				</prop>
				<!-- 每次都验证连接是否可用 --> 
				<prop key="hibernate.c3p0.validate">
					true
				</prop>
			</props>
		</property>
	</bean>
	

 3)这里的dataSource可以是jndi。

 

三。dataSource(spring,开发常用)

如果使用spring,同时项目中不使用jndi,又不想配置到Hibernate中,可以直接将C3P0配置到dataSource中即可,如下:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
  <property name="driverClass"><value>oracle.jdbc.driver.OracleDriver</value></property>
  <property name="jdbcUrl"><value>jdbc:oracle:thin:@localhost:1521:Test</value></property>
  <property name="user"><value>Kay</value></property>
  <property name="password"><value>root</value></property>
  <!--连接池中保留的最小连接数。-->
  <property name="minPoolSize" value="10" />
  <!--连接池中保留的最大连接数。Default: 15 -->
  <property name="maxPoolSize" value="100" />
  <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
  <property name="maxIdleTime" value="1800" />
  <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
  <property name="acquireIncrement" value="3" />
  <property name="maxStatements" value="1000" />
  <property name="initialPoolSize" value="10" />
  <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
  <property name="idleConnectionTestPeriod" value="60" />
  <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
  <property name="acquireRetryAttempts" value="30" />
  <property name="breakAfterAcquireFailure" value="true" />
  <property name="testConnectionOnCheckout" value="false" />
  </bean>

 

 

 

参考资料:

参数说明:http://baike.baidu.com/view/920062.htm

Hibernate连接池配置:http://dengjianqiang200.blog.163.com/blog/static/658119201032313017139

Jndi 与 c3p0 结合:http://yakar.iteye.com/blog/356243

C3P0容错和自动重连特性:http://hi.baidu.com/ivexrhlaozbdqtq/item/ad9572973a5312f2291647b1

 

 

 

 

分享到:
评论
2 楼 di1984HIT 2016-02-10  
恩,学习了~
1 楼 Litmmp 2015-08-16  
博主,你好!
你的参数说明里面:acquireIncrement的解释错了吧?
应该是“c3p0连接池中的连接已被用完,但是池中已有连接总数还没有达到maxPoolSize值,就尝试从数据库一次性获取新连接的数量”
c3p0连接池中的连接总数最大值是maxPoolSize

相关推荐

    实现连接池C3P0操作数据库实战

    本实战将详细介绍如何使用C3P0来实现数据库连接池,并通过实际操作演示其工作流程。 首先,C3P0是Com审议Connection Pooling的简称,由M-Fusion公司开发并维护。它主要负责管理数据库连接,避免频繁地创建和关闭...

    java hibernate c3p0

    8. **实战应用**:通过实际案例,演示如何在项目中集成C3P0和Hibernate,包括Maven或Gradle的依赖管理、配置文件的编写、以及在代码中如何使用SessionFactory和Session。 9. **最佳实践**:提供使用C3P0和Hibernate...

    ajax、json、dbcp、c3p0操作录像.rar

    这些视频教程很可能是深入讲解如何在实际项目中运用Ajax、Json、Dbcp和C3p0的实战教学,涵盖了从基础知识到高级技巧,对于希望提升Java Web开发技能的人来说非常有价值。通过学习,开发者可以掌握如何利用Ajax创建...

    演示EJB3.0 + JPA + MySQL5.0 + C3P0连接池技术实战编程(Top-Down的XP开发方式)

    环境:Windows Professional XP, JDK 1.6, Ant 1.7, jboss-4.2.1.GA, MySQL 5.0, 连接池C3P0. 使用步骤: 1. 下载之后先运行ant hibernatetool命令 2. 如果构建成功,那么运行ant compress命令 3. 把在lib目录下...

    hibernate-release-5.2.16.Final源码包

    《深入剖析Hibernate 5.2.16.Final源码:结合c3p0与dom4j的实战解析》 Hibernate作为Java领域中备受推崇的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以专注于业务逻辑而不是繁琐的数据访问层...

    IDEASSM框架实战CRUDSSM整合配置MyBatis逆向工程.docx

    - **数据源配置**:使用C3P0连接池。 - **SqlSessionFactory**:MyBatis的核心组件之一,负责创建SqlSession。 - **事务管理器**:用于处理事务相关的逻辑。 - **注解驱动**:开启基于注解的事务管理功能。 - **组件...

    JavaWeb开发实战源码

    5. **数据库连接**:项目可能使用JDBC(Java Database Connectivity)进行数据库操作,包括连接池管理(如C3P0、DBCP)、SQL查询和结果集处理。 6. **MVC模式**:很多JavaWeb应用遵循MVC(Model-View-Controller)...

    Javaweb整合开发实战

    在实际项目中,通常会使用连接池管理数据库连接,例如Apache的DBCP或C3P0,以提高性能和资源利用率。 "第3章"可能涉及到数据库操作或者MVC框架的使用,具体内容可能涵盖数据库模型设计、JDBC操作、事务处理、Spring...

    Java Web典型模块与项目实战大全源代码26

    可能会讲解JDBC(Java Database Connectivity)API的使用,包括连接池的配置(如C3P0、DBCP或HikariCP)、SQL语句的执行以及结果集的处理。 4. **框架应用**:Spring框架是Java Web开发的核心,它提供了依赖注入、...

    proxool连接池配置详解

    Proxool是一个开源的轻量级Java数据库连接池实现,其主要目标是替代常见的数据库连接池解决方案,如C3P0或DBCP,并且提供了更加灵活和易于配置的特性。在实际应用中,合理配置Proxool可以显著提高系统的性能和稳定性...

    大型商场项目实战springmvc视频教程

    - 使用C3P0或Druid作为数据库连接池,提高数据库访问效率。 #### 三、Controller与Service层设计 1. **Controller设计原则**: - 单一职责原则:每个Controller只负责一个特定的功能模块。 - 使用注解简化开发...

    Spring实战之属性占位符配置器用法示例

    &lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:driverClass="${jdbc.driverClassName}" p:jdbcUrl="${jdbc.url}" p:user="${jdbc.username}" p:...

    MLDN——Java Web 开发实战经典源码笔记(基础篇)|

    5. **JDBC数据库操作**:包括数据库连接、SQL语句执行、结果集处理等,以及连接池的使用,如C3P0或DBCP。 6. **过滤器和监听器**:介绍Filter接口和Listener接口的使用,它们可以用于拦截请求、响应,以及监听应用...

    HealthCare.zip

    通过配置C3P0的参数,如maxPoolSize、minPoolSize等,可以调整连接池的大小,以适应不同规模的应用需求。 四、MySQL数据库 MySQL是一种广泛使用的开源关系型数据库管理系统,以其高效、稳定和易用的特点受到开发者...

    韩顺平 j2ee视频实战教程》servlet + jsp的视频

    - **数据库连接池**:探讨如何使用C3P0等工具实现高效的数据库连接管理。 #### 第9讲:综合案例实践 - **项目需求分析**:分析项目的背景、目标用户及功能需求。 - **系统设计与实现**:根据需求文档完成系统的...

    [实战]Java分布式高级架构师课程学习笔记.docx

    这需要应用层面的支持,比如使用数据库连接池(如C3P0、HikariCP等)来智能分配读写连接。 3. **MySQL集群配置**: MySQL集群可能采用如MySQL Replication、MySQL Cluster(NDB Cluster)等形式,通过多节点间的...

    第3章【源码】java web整合开发实战--基于struts 2+hibernate+spring 贾蓓 镇明敏 杜磊

    4. **数据库连接池的配置**:如使用C3P0或DBCP配置数据库连接池,优化数据库操作性能。 5. **JSP和标签库的使用**:掌握如何在JSP页面上使用Struts 2和Spring提供的标签库,简化视图层的开发。 6. **单元测试和集成...

    JavaWeb开发从入门到实战课件PPT

    - 数据库连接池:如C3P0、Apache DBCP、HikariCP等,用于优化数据库资源的管理。 7. **会话管理**: - HttpSession接口:创建、获取、移除session,以及session的生命周期。 - Cookie的使用:持久化用户状态,跨...

    jsp宝典项目实战所需的llbbs.jar和poolman.jar包打包下载

    需要注意的是,虽然PoolMan在当时是一个优秀的选择,但随着技术的发展,现在更常见的是使用C3P0、Druid或HikariCP等更现代的数据库连接池组件,它们提供了更好的性能和更丰富的特性。 总结起来,"llbbs.jar"是"jsp...

Global site tag (gtag.js) - Google Analytics