c3p0的配置方式分为三种,分别是
1.setters一个个地设置各个配置项
2.类路径下提供一个c3p0.properties文件
3.类路径下提供一个c3p0-config.xml文件
1.setters一个个地设置各个配置项
这种方式最繁琐,形式一般是这样:
01 |
Properties props = new Properties(); |
02 |
InputStream in = ConnectionManager. class .getResourceAsStream( "/c3p0.properties" ); |
06 |
ComboPooledDataSource cpds = new ComboPooledDataSource(); |
07 |
cpds.setDriverClass(props.getProperty( "driverClass" )); |
08 |
cpds.setJdbcUrl(props.getProperty( "jdbcUrl" )); |
09 |
cpds.setUser(props.getProperty( "user" )); |
10 |
cpds.setPassword(props.getProperty( "password" )); |
因为繁琐,所以很不适合采用,于是文档提供了另外另种方式。
2.
类路径下提供一个c3p0.properties文件
文件的命名必须是c3p0.properties,里面配置项的格式为:
1 |
c3p0.driverClass=com.mysql.jdbc.Driver |
2 |
c3p0.jdbcUrl=jdbc:mysql: //localhost:3306/jdbc |
上面只提供了最基本的配置项,其他配置项参照 文档配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单:
1 |
private static ComboPooledDataSource ds = new ComboPooledDataSource(); |
3 |
public static Connection getConnection() { |
5 |
return ds.getConnection(); |
6 |
} catch (SQLException e) { |
7 |
throw new RuntimeException(e); |
3.类路径下提供一个c3p0-config.xml文件
这种方式使用方式与第二种差不多,但是有更多的优点
(1).更直观明显,很类似hibernate和spring的配置
(2).可以为多个数据源服务,提供default-config和named-config两种配置方式
下面是一个配置模板:
03 |
< property name = "user" >root</ property > |
04 |
< property name = "password" >java</ property > |
05 |
< property name = "driverClass" >com.mysql.jdbc.Driver</ property > |
06 |
< property name = "jdbcUrl" >jdbc:mysql://localhost:3306/jdbc</ property > |
08 |
< property name = "initialPoolSize" >10</ property > |
09 |
< property name = "maxIdleTime" >30</ property > |
10 |
< property name = "maxPoolSize" >100</ property > |
11 |
< property name = "minPoolSize" >10</ property > |
14 |
< named-config name = "myApp" > |
15 |
< property name = "user" >root</ property > |
16 |
< property name = "password" >java</ property > |
17 |
< property name = "driverClass" >com.mysql.jdbc.Driver</ property > |
18 |
< property name = "jdbcUrl" >jdbc:mysql://localhost:3306/jdbc</ property > |
20 |
< property name = "initialPoolSize" >10</ property > |
21 |
< property name = "maxIdleTime" >30</ property > |
22 |
< property name = "maxPoolSize" >100</ property > |
23 |
< property name = "minPoolSize" >10</ property > |
如果要使用default-config则初始化数据源的方式与第二种一样,如果要使用named-config里面配置初始化数据源,则只要使用一个带参数的ComboPooledDataSource构造器就可以了
1 |
private static ComboPooledDataSource ds = new ComboPooledDataSource( "myApp" ); |
下面整理一下从文档和网上学习到的c3p0配置的理解
(user,password,driverClass,jdbcUrl没有说的必要)
1.基本配置项
03 |
连接池在无空闲连接可用时一次性创建的新数据库连接数 |
11 |
连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待 |
16 |
连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接 |
21 |
连接池保持的最小连接数,后面的maxIdleTimeExcessConnections跟这个配合使用来减轻连接池的负载 |
2.管理连接池的大小和连接的生存时间
03 |
配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待 |
04 |
它close再断开。配置为0的时候则不会对连接的生存时间进行限制。 |
06 |
maxIdleTimeExcessConnections |
08 |
这个配置主要是为了减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接 |
09 |
但是后面的时间段需要的数据库连接数很少,则此时连接池完全没有必要维护那么多的连接,所以有必要将 |
10 |
断开丢弃掉一些连接来减轻负载,必须小于maxIdleTime。配置不为0,则会将连接池中的连接数量保持到minPoolSize。 |
maxIdleTime也可以归属到这一类,前面已经写出来了。
3.配置连接测试:因为连接池中的数据库连接很有可能是维持数小时的连接,很有可能因为数据库服务器的问题,网络问题等导致实际连接已经无效,但是连接池里面的连接还是有效的,如果此时获得连接肯定会发生异常,所以有必要通过测试连接来确认连接的有效性。
下面的前三项用来配置如何对连接进行测试,后三项配置对连接进行测试的时机。
03 |
用来配置测试连接的一种方式。配置一个表名,连接池根据这个表名创建一个空表, |
04 |
并且用自己的测试sql语句在这个空表上测试数据库连接 |
05 |
这个表只能由c3p0来使用,用户不能操作,同时用户配置的preferredTestQuery
将会被忽略。 |
09 |
用来配置测试连接的另一种方式。与上面的automaticTestTable二者只能选一。 |
10 |
如果要用它测试连接,千万不要设为null,否则测试过程会很耗时,同时要保证sql语句中的表在数据库中一定存在。 |
12 |
connectionTesterClassName |
13 |
default :
com.mchange.v2.c3p0.impl.DefaultConnectionTester |
14 |
连接池用来支持automaticTestTable和preferredTestQuery测试的类,必须是全类名,就像默认的那样, |
15 |
可以通过实现UnifiedConnectionTester接口或者继承AbstractConnectionTester来定制自己的测试方法 |
17 |
idleConnectionTestPeriod |
19 |
用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它 |
20 |
保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL |
23 |
testConnectionOnCheckin |
25 |
如果为true,则在close的时候测试连接的有效性。为了提高测试性能,可以与idleConnectionTestPeriod搭配使用, |
26 |
配置preferredTestQuery或automaticTestTable也可以加快测试速度。 |
28 |
testConnectionOnCheckout |
30 |
性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能, |
31 |
可以与idleConnectionTestPeriod搭配使用, |
32 |
配置preferredTestQuery或automaticTestTable也可以加快测试速度。 |
4.配置PreparedStatement缓存
03 |
连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以 |
04 |
这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。为0的时候不缓存, |
05 |
同时maxStatementsPerConnection的配置无效。 |
07 |
maxStatementsPerConnection |
09 |
连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为 |
10 |
它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。 |
5.重连相关配置
03 |
连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功 |
09 |
breakAfterAcquireFailure |
11 |
如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。 |
个人觉得上述三个没有更改的必要,但可以将acquireRetryDelay配置地更短一些
6.定制管理Connection的生命周期
1 |
connectionCustomizerClassName |
3 |
用来定制Connection的管理,比如在Connection acquire
的时候设定Connection的隔离级别,或者在 |
4 |
Connection丢弃的时候进行资源关闭,就可以通过继承一个AbstractConnectionCustomizer来实现相关 |
5 |
方法,配置的时候使用全类名。有点类似监听器的作用。 |
例如:
01 |
import java.sql.Connection; |
02 |
import com.mchange.v2.c3p0.AbstractConnectionCustomizer; |
04 |
public class ConnectionCustomizer extends AbstractConnectionCustomizer{ |
07 |
public void onAcquire(Connection c, String
parentDataSourceIdentityToken) |
09 |
System.out.println( "acquire : " + c); |
12 |
public void onCheckIn(Connection c, String
parentDataSourceIdentityToken) |
14 |
System.out.println( "checkin : " + c); |
17 |
public void onCheckOut(Connection c, String
parentDataSourceIdentityToken) |
19 |
System.out.println( "checkout : " + c); |
22 |
public void onDestroy(Connection c, String
parentDataSourceIdentityToken) |
24 |
System.out.println( "destroy : " + c); |
1 |
< property name = "connectionCustomizerClassName" >liuyun.zhuge.db.ConnectionCustomizer</ property > |
7.配置未提交的事务处理
7 |
forceIgnoreUnresolvedTransactions |
一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?
8.配置debug和回收Connection
01 |
unreturnedConnectionTimeout |
03 |
为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收 |
04 |
Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭 |
05 |
情况的不是很适用。为0不对connection进行回收,即使它并没有关闭。 |
07 |
debugUnreturnedConnectionStackTraces |
09 |
如果为true并且unreturnedConnectionTimeout设为大于0的值,当所有被getConnection出去的连接 |
10 |
unreturnedConnectionTimeout时间到的时候,就会打印出堆栈信息。只能在debug模式下适用,因为 |
11 |
打印堆栈信息会减慢getConnection的速度 |
同第七项一样的,连接用完当然得close了,不要通过unreturnedConnectionTimeout让连接池来回收未关闭的连接。
9.其他配置项:因为有些配置项几乎没有自己配置的必要,使用默认值就好,所以没有再写出来
3 |
配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放 |
4 |
或者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException |
- 【c3p0】 C3P0的三种配置方式以及基本配置项详解
数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. ---------------------------------------- ...
- tomcat下jndi的三种配置方式
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- 【转】tomcat下jndi的三种配置方式
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- spring Bean的三种配置方式
Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...
- IIS下PHP的三种配置方式比较
在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异. 1. ...
- c3p0三种配置方式(automaticTestTable)
c3p0的配置方式分为三种,分别是http://my.oschina.net/lyzg/blog/551331.setters一个个地设置各个配置项2.类路径下提供一个c3p0.properties文 ...
- Hive metastore三种配置方式
http://blog.csdn.net/reesun/article/details/8556078 Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储.远端存储比较适 ...
- MyEclipse中web服务器的三种配置方式
初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通 ...
- struts2简单入门-Action的三种配置方式
普通的配置方式 优点:可读性高 缺点:重复的配置太多. 使用情况 一个actian只有一个方法,只需要处理一种请求. 代码演示 <action name="voteResult&quo ...
随机推荐
- 《DSP using MATLAB》示例Example7.14
代码: M = 20; alpha = (M-1)/2; l = 0:M-1; wl = (2*pi/M)*l; Hrs = [1, 1, 1, zeros(1, 15), 1, 1]; % Idea ...
- jQuery的deferred对象详解(转载)
jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本.(由于无法转载,复制原文 .原文链接——原作者:阮一峰) 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5. ...
- 多文件的Makefile
Linux下编写一般采用gcc编译工具,但gcc无法满足大量的文件同时编译,这是就用到Makefile,首先先介绍一下gcc GCC编译的四个步骤 1.预处理,生成预编译文件(.文件): Gcc –E ...
- golang的指针到string,string到指针的转换
由于某个需求,需要如题的转换,废话不多说,直接贴代码了,其实挺丑了,备用了 func (this *Server) socketParserHandler(client *genTcpServer.C ...
- Juicer自定义函数
首先,先写自定义的方法: function (sex) { ; ; var Range = Max - Min; var Rand = Math.random(); var res = (Min + ...
- 【转】Jmeter使用之常用函数介绍
"_csvRead"函数 csvRead函数是从外部读取参数,csvRead函数可以从一个文件中读取多个参数. 下面具体讲一下如何使用csvread函数: 1.新建一个csv或者t ...
- 设计模式-访问者(Visitor)模式
访问者模式是对象的行为模式.访问者模式的目的是封装施加在某种数据结构元素上的操作.一旦一些操作需要修改,接受这个操作的数据结构可以保持不变. 个人觉得访问者模式相对其他的设计模式来说稍微复杂,难理解一 ...
- 第八章 搭建hadoop2.2.0集群,Zookeeper集群和hbase-0.98.0-hadoop2-bin.tar.gz集群
安装配置jdk,SSH 一.首先,先搭建三台小集群,虚拟机的话,创建三个 下面为这三台机器分别分配IP地址及相应的角色:集群有个特点,三台机子用户名最好一致,要不你就创建一个组,把这些用户放到组里面去 ...
- java类继承总结一 父类类型与子类类型之间的转化问题(转)
java类继承总结一 父类类型与子类类型之间的转化问题 本文将通过一个实例描述父类类型与子类类型之间的转化问题,这个很特殊的问题常常会导致一些潜在的危险,让你整整一个晚上都在调试程序以解决一个让人抓狂 ...
- oracke创建db link
-- Create database link create public database link test_link connect to 用户名 identified by 密码 using ...