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
C3P0配置实战的更多相关文章
- Tomcat下使用c3p0配置jndi数据源
下载c3p0包: 下载地址:https://sourceforge.net/projects/c3p0/files/?source=navbar 解压后得到包:c3p0-0.9.2.jar,mchan ...
- c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗?
c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗? c3p0配置 initialPoolSize 和minPoolSize 可以设为0吗?设0有坏处吗 ...
- JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源
一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar
- PHP-5.5.10+Apache httpd-2.4.9在Windows系统下配置实战
原文 PHP-5.5.10+Apache httpd-2.4.9在Windows系统下配置实战 环境配置: 程序准备: PHP windows版本下载地址: http://windows.php. ...
- Tomcat下使用C3P0配置JNDI数据源(在项目的META-INF目录下创建context.xml的文件)
一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar 下载完成之后得到一个压缩包
- 深入浅出 SSL 管理配置实战
我们生活在一个信息大爆炸的时代,几乎每天都在和互联网打交道,购物.网银转账.支付宝付款.搜索信息.查看邮件.观看视频.微信聊天.上网冲浪.阅读新闻等,无不时时刻刻在和网络打交道.那如何保护网络安全就相 ...
- JNDI学习总结——Tomcat下使用C3P0配置JNDI数据源
一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar
- spring中通过JNDI、DBCP、C3P0配置数据源
JNDI配置数据源 1.首先在tomcat的server.xml中配置数据源信息,找到Context,然后在里边加入如下代码 <Context docBase="SpringDemo& ...
- spring c3p0 配置
spring c3p0 配置 <?xml version="1.0" encoding="UTF-8"?> <beansxmlns=& ...
随机推荐
- js多线程(worker)
浏览器端js是单线程执行,所以当js执行高负载运算时,UI渲染就会阻塞,页面就会出现卡顿,用户体验就不是很好 js为此也提供了异步操作,例如: 定时器(setTimeout 和 setInterval ...
- 控制器隐藏了导航 下页pop 导航位置看到黑条
控制器隐藏了导航 下页pop 导航位置看到黑条 解决: -(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear ...
- 【node+小程序+web端】简单的websocket通讯
[node+小程序+web端]简单的websocket通讯 websoket是用来做什么的? 聊天室 消息列表 拼多多 即时通讯,推送, 实时交互 websoket是什么 websocket是一个全新 ...
- php对文件的操作
如何让自己磁盘中的文件夹和目录显示在网页上?那就来看一下,用php是怎么来操作他们的吧 php中文件,一般包含两块内容,文件和目录先来一句一句的看代码,及他的作用 运行后看一下结果 file 指的是文 ...
- 韩顺平php从入门到精通
37 整型细节说明 $a; echo $a; var_dump($a) //NULL 一个数总是要占用内存空间(字节),在php中一个整数一般占用四个字节(与平台相关),一个字节占用8bit php的 ...
- 团队项目第二阶段个人进展——Day1
一.昨天工作总结 冲刺第一天,查看了第一阶段的代码 二.遇到的问题 写个的代码发现看不懂了 三.今日工作规划 重新设计页面布局
- Python数据类型之dict和set
Python内置了字典:dict的支持.在其他语言中也成为map,使用键-值(key-value)存储,具有极快的查找速度. 把数据放入dict的方法,除了初始化时指定外,还可以通过key放入. 由于 ...
- 通过递增快照备份 Azure 非托管 VM 磁盘
概述 Azure 存储提供创建 Blob 快照的功能. 快照将捕获该时间点的 Blob 状态. 本文介绍有关如何使用快照维护虚拟机磁盘备份的方案. 如果选择不使用 Azure 备份和恢复服务,但想要为 ...
- 使用 Visual Studio Team Services 和 IIS 创建持续集成管道
若要将应用程序开发的生成.测试和部署阶段自动化,可以使用持续集成和部署 (CI/CD) 管道. 本教程介绍如何在 Azure 中使用 Visual Studio Team Services 和 Win ...
- Sql Server与.Net(C#)中星期值对比
最近发现Sql Server与.Net(C#)中星期值居然不匹配,倒不知道依哪一个了. 1.Sql Server declare @date datetime; set @date = '2017-0 ...