【c3p0】 C3P0的三种配置方式以及基本配置项详解
数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理。
-------------------------------------------------------------------------------------------------------------------------------------------
c3p0的配置方式分为三种,分别是
1.setters一个个地设置各个配置项(不推荐)
2.类路径下提供一个c3p0.properties文件
3.类路径下提供一个c3p0-config.xml文件
一、实现方式:
1.自己动手写代码,实现数据源(setters一个个地设置各个配置项)
例如:在类路径下配置一个属性文件,config.properties,内容如下:
driverClass=xxx
jdbcUrl=xxx
user=xxx
password=xxx
...
然后代码中实现
Properties props = new Properties();
InputStream in = Thread.class.getResourceAsStream("config.properties");
props.load(in);
in.close();
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass(props.getProperty("driverClass"));
cpds.setJdbcUrl(props.getProperty("jdbcUrl"));
cpds.setUser(props.getProperty("user"));
cpds.setPassword(props.getProperty("password"));
...
这里实现了一个数据源。
也可以这样配置,在类路径下配置一个xml文件,config.xml
<config>
<source name="source1">
<property name="user">root</property>
<property name="password">xxx</property>
<property name="url">xxx</property>
<property name="driverClass">xxx</property>
</source>
<source name="source2">
...
</source>
</config>
然后自己解析xml文件,这样可以实现多个数据源的配置。
---------------------------------------------------------------------------------------------------------------------------------------------------
2.配置默认的熟悉文件
类路径下提供一个c3p0.properties文件(不能改名)
配置如下:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
c3p0.user=root
c3p0.password=java
-------------------------------------------------------------------------------------------------------------------------------------------------------
这种方式使用方式与第二种差不多,但是有更多的优点
(1).更直观明显,很类似hibernate和spring的配置
(2).可以为多个数据源服务,提供default-config和named-config两种配置方式
<c3p0-config>
<default-config>
<property name="user">root</property>
<property name="password">java</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</default-config>
<named-config name="mySource">
<property name="user">root</property>
<property name="password">java</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">10</property>
</named-config>
</c3p0-config>
...
DataSource ds = new ComboPooledDataSource("mySource");
return ds;//获得数据源
获得数据库链接 return ds.getConnection()
...
这样就可以使用数据源了。
下面给出第三种方式的例子代码:
a. src下面的创建的c3p0-confit.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <c3p0-config>
- <default-config>
- <property name="user">sa</property>
- <property name="password"></property>
- <property name="driverClass">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
- <property name="jdbcUrl">jdbc:microsoft:sqlserver://192.168.0.252:6252;databasename=szWq</property>
- <property name="initialPoolSize">10</property>
- <property name="maxIdleTime">30</property>
- <property name="maxPoolSize">100</property>
- <property name="minPoolSize">10</property>
- </default-config>
- </c3p0-config>
b.获取数据库连接的帮助类DBConn.java
- import java.sql.*;
- import com.mchange.v2.c3p0.ComboPooledDataSource;
- /**********************************************
- * 功能: 链接数据库代码
- *********************************************
- */
- public class DBConn {
- private static ComboPooledDataSource ds = new ComboPooledDataSource();
- //取得链接
- public static Connection getConn() {
- try {
- return ds.getConnection();
- }catch (SQLException e) {
- throw new RuntimeException(e);
- }
- }
- // 关闭链接
- public static void close(Connection conn) throws SQLException {
- if (conn != null) {
- try {
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- throw e;
- }
- }
- }
- public static void close(PreparedStatement pstate) throws SQLException {
- if(pstate!=null){
- pstate.close();
- }
- }
- public static void close(ResultSet rs) throws SQLException {
- if(rs!=null){
- rs.close();
- }
- }
- }
二、部分参数配置说明:
1.最常用配置
initialPoolSize:连接池初始化时创建的连接数,default : 3(建议使用)
minPoolSize:连接池保持的最小连接数,default : 3(建议使用)
maxPoolSize:连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15(建议使用)
acquireIncrement:连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3(建议使用)
2.管理连接池的大小和连接的生存时间
maxConnectionAge:配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待它close再断开。配置为0的时候则不会对连接的生存时间进行限制。default : 0 单位 s(不建议使用)
maxIdleTime:连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,即回收此连接。default : 0 单位 s(建议使用)
maxIdleTimeExcessConnections:这个配置主要是为了快速减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接,但是后面的时间段需要的数据库连接数很少,需要快速释放,必须小于maxIdleTime。其实这个没必要配置,maxIdleTime已经配置了。default : 0 单位 s(不建议使用)
3.配置连接测试:
automaticTestTable:配置一个表名,连接池根据这个表名用自己的测试sql语句在这个空表上测试数据库连接,这个表只能由c3p0来使用,用户不能操作。default : null(不建议使用)
preferredTestQuery:与上面的automaticTestTable二者只能选一。自己实现一条SQL检测语句。default : null(建议使用)
idleConnectionTestPeriod:用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL8小时无会话的状态打破。为0则不测试。default : 0(建议使用)
testConnectionOnCheckin:如果为true,则在close的时候测试连接的有效性。default : false(不建议使用)
testConnectionOnCheckout:性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能,尽量不要用。default : false(不建议使用)
4.配置PreparedStatement缓存:
maxStatements:连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。同时maxStatementsPerConnection的配置无效。default : 0(不建议使用)
maxStatementsPerConnection:连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。default : 0(看情况而论)
5.重连相关配置
acquireRetryAttempts:连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功。default : 30(建议使用)
acquireRetryDelay:连接池在获得新连接时的间隔时间。default : 1000 单位ms(建议使用)
breakAfterAcquireFailure:如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。default : false(不建议使用)
checkoutTimeout:配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放或者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException。其实就是acquireRetryAttempts*acquireRetryDelay。default : 0(与上面两个,有重复,选择其中两个都行)
6.定制管理Connection的生命周期
connectionCustomizerClassName:用来定制Connection的管理,比如在Connection acquire 的时候设定Connection的隔离级别,或者在Connection丢弃的时候进行资源关闭,
就可以通过继承一个AbstractConnectionCustomizer来实现相关方法,配置的时候使用全类名。有点类似监听器的作用。default : null(不建议使用)
7.配置未提交的事务处理
autoCommitOnClose:连接池在回收数据库连接时是否自动提交事务。如果为false,则会回滚未提交的事务,如果为true,则会自动提交事务。default : false(不建议使用)
forceIgnoreUnresolvedTransactions:这个配置强烈不建议为true。default : false(不建议使用)
一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?
8.配置debug和回收Connection
unreturnedConnectionTimeout:为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭情况的不是很适用。建议手动关闭。default : 0 单位 s(不建议使用)
debugUnreturnedConnectionStackTraces:如果为true并且unreturnedConnectionTimeout设为大于0的值,当所有被getConnection出去的连接unreturnedConnectionTimeout时间到的时候,就会打印出堆栈信息。只能在debug模式下适用,因为打印堆栈信息会减慢getConnection的速度default : false(不建议使用)
其他配置项:因为有些配置项几乎没有自己配置的必要,使用默认值就好,所以没有再写出来。
三、示例:
示例采用第二种方式:
1.c3p0.properties:
- #驱动
- c3p0.driverClass=com.mysql.jdbc.Driver
- #地址
- c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
- #用户名
- c3p0.user=root
- #密码
- c3p0.password=lovejava
- #-------------------------------
- #连接池初始化时创建的连接数
- c3p0.initialPoolSize=3
- #连接池保持的最小连接数
- c3p0.minPoolSize=3
- #连接池在无空闲连接可用时一次性创建的新数据库连接数,default:3
- c3p0.acquireIncrement=3
- #连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15
- c3p0.maxPoolSize=15
- #连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接,单位秒
- c3p0.maxIdleTime=100
- #连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功
- c3p0.acquireRetryAttempts=30
- #连接池在获得新连接时的间隔时间
- c3p0.acquireRetryDelay=1000
2.ConnectionPool
- package com.study.pool;
- import java.sql.Connection;
- import java.sql.SQLException;
- import javax.sql.DataSource;
- import com.mchange.v2.c3p0.ComboPooledDataSource;
- public class ConnectionPool {
- private DataSource ds;
- private static ConnectionPool pool;
- private ConnectionPool(){
- ds = new ComboPooledDataSource();
- }
- public static final ConnectionPool getInstance(){
- if(pool==null){
- try{
- pool = new ConnectionPool();
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- return pool;
- }
- public synchronized final Connection getConnection() {
- try {
- return ds.getConnection();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
3.PoolThread
- package com.study.pool;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- public class PoolThread extends Thread {
- @Override
- public void run(){
- ConnectionPool pool = ConnectionPool.getInstance();
- Connection con = null;
- PreparedStatement stmt= null;
- ResultSet rs = null;
- try{
- con = pool.getConnection();
- stmt = con.prepareStatement("select sysdate as nowtime from dual");
- rs = stmt.executeQuery();
- while(rs.next()){
- System.out.println(Thread.currentThread().getId()+"---------------开始"+rs.getString("nowtime"));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally{
- try {
- rs.close();
- stmt.close();
- con.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- System.out.println(Thread.currentThread().getId()+"--------结束");
- }
- }
4.PoolMain
- package com.study.pool;
- public class PoolMain {
- /**
- * 数据源缓冲池 实例练习
- */
- public static void main(String[] args) {
- System.out.println("缓冲池模拟开始");
- PoolThread[] threads = new PoolThread[50];
- for(int i=0;i<threads.length;i++){
- threads[i] = new PoolThread();
- }
- for(int i=0;i<threads.length;i++){
- threads[i].start();
- }
- }
- }
最后附一个集成spring的properties配置:(也是我项目中用的配置)
db.properties
- ;;;;;;;;;;;;;;;;;;;;
- ;DataBaseConnection;
- ;;;;;;;;;;;;;;;;;;;;
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/exam5
- jdbc.username=root
- jdbc.password=123456
- jdbc.initialPoolSize=10
- jdbc.minPoolSize=5
- jdbc.maxPoolSize=30
- jdbc.maxIdleTime=200
- jdbc.maxStatementsPerConnection=50
spring配置数据源
- <!-- 0.连接池属性设置读取指定的properties文件 -->
- <context:property-placeholder location="classpath:db.properties" />
- <!-- 1.将连接池放入spring容器 -->
- <bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
- destroy-method="close">
- <property name="jdbcUrl" value="${jdbc.url}"></property>
- <property name="driverClass" value="${jdbc.driver}"></property>
- <property name="user" value="${jdbc.username}"></property>
- <property name="password" value="${jdbc.password}"></property>
- <property name="initialPoolSize" value="${jdbc.initialPoolSize}"></property>
- <property name="minPoolSize" value="${jdbc.minPoolSize}"></property>
- <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
- <property name="maxIdleTime" value="${jdbc.maxIdleTime}"></property>
- <property name="maxStatementsPerConnection" value="${jdbc.maxStatementsPerConnection}"></property>
- </bean>
【c3p0】 C3P0的三种配置方式以及基本配置项详解的更多相关文章
- 【jdbc】【c3p0】c3p0三种配置方式【整理】
c3p0三种配置方式 c3p0的配置方式分为三种,分别是1.setters一个个地设置各个配置项2.类路径下提供一个c3p0.properties文件3.类路径下提供一个c3p0-config.xml ...
- tomcat下jndi的三种配置方式
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- IIS下PHP的三种配置方式比较
在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异. 1. ...
- 【转】tomcat下jndi的三种配置方式
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- spring Bean的三种配置方式
Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...
- 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 ...
随机推荐
- django 使用多个数据库
在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接. 参考:http://blog.csdn.net/songfree ...
- Spring mvc RequestContextHolder分析
转载: http://blog.csdn.net/zzy7075/article/details/53559902
- 常用HTTP状态码
1.常用状态码介绍 在http响应协议中,我们通过HttpWatch抓包抓取到响应信息.其中响应首行中就包含一个状态码.状态码由三位数字组成,表示请求是否被理解或者被满足.HTTP响应状态码的第一个数 ...
- autolayout UILabel 设置最大宽度
label1.preferredMaxLayoutWidth = 100: label1.numberOfLines = 0; //自适应行数
- vue - process.env 定义
1.官方解释:process 对象是一个 global (全局变量),提供有关信息,控制当前 Node.js 进程.作为一个对象,它对于 Node.js 应用程序始终是可用的,故无需使用 requir ...
- Qt使用MSVC编译器不能正确显示中文的解决方案
用VisualStudio做为IDE,使用Qt框架,显示中文,会出现乱码的情况. 原因:MSVC编译器虽然可以正常编译带BOM的UTF-8编译的源文件,但是生成的可执行文件的编码是Windows本地字 ...
- python之commands模块
要获得shell命令的输出只需要`cmd`命令就可以了, 需要得到命令执行的状态则需要判断$?的值, 在Python中有一个模块commands也很容易做到以上的效果.看一下三个函数:1). comm ...
- spring学习笔记(三)
spring jdbc spring tx 1.spring的jdbc模板 Spring提供了很多持久层技术的模板类简化编程: 1.1.jdbc模板的基本使用 @Test // JDBC模板的基本使用 ...
- valgrind: failed to start tool 'memcheck' for platform 'amd64-linux': No such file or directory
这是没有配置lib环境变量的缘故. 注意要把lib配置放到path配置前面. 导出VALGRIND_LIB路径,用法如下(假设valgrind已经被安装到/home/test/valgrind目录): ...
- 91. Decode Ways (Array; DP)
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...