数据库连接池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

root

xxx

xxx

xxx

...

然后自己解析xml文件,这样可以实现多个数据源的配置。

---------------------------------------------------------------------------------------------------------------------------------------------------

2.配置默认的熟悉文件

类路径下提供一个c3p0.properties文件(不能改名)

配置如下:

c3p0.driverClass=com.mysql.jdbc.Driver

c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc

c3p0.user=root

c3p0.password=java

...

上面只提供了最基本的配置项,其他配置项参照文章后面的文档配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单:

...

DataSource  ds = new ComboPooledDataSource();

return ds;

获得数据库链接  return ds.getConnection()

...

然后就可以使用数据源了,C3P0会对c3p0.properties进行自动解析的

-------------------------------------------------------------------------------------------------------------------------------------------------------

3.路径下提供一个c3p0-config.xml文件

这种方式使用方式与第二种差不多,但是有更多的优点

(1).更直观明显,很类似hibernate和spring的配置

(2).可以为多个数据源服务,提供default-config和named-config两种配置方式

root

java

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/jdbc

10

30

100

10

root

java

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/jdbc

10

30

100

10

...

DataSource  ds = new ComboPooledDataSource("mySource");

return ds;//获得数据源

获得数据库链接 return ds.getConnection()

...

这样就可以使用数据源了。

下面给出第三种方式的例子代码:

a. src下面的创建的c3p0-confit.xml文件

sa

com.microsoft.jdbc.sqlserver.SQLServerDriver

jdbc:microsoft:sqlserver://192.168.0.252:6252;databasename=szWq

10

30

100

10

b.获取数据库连接的帮助类DBConn.java

import java.sql.*;importcom.mchange.v2.c3p0.ComboPooledDataSource;/**********************************************

* 功能: 链接数据库代码

**********************************************/

public classDBConn {private static ComboPooledDataSource ds = newComboPooledDataSource();//取得链接

public staticConnection getConn() {try{returnds.getConnection();

}catch(SQLException e) {throw newRuntimeException(e);

}

}//关闭链接

public static void close(Connection conn) throwsSQLException {if (conn != null) {try{

conn.close();

}catch(SQLException e) {

e.printStackTrace();throwe;

}

}

}public static void close(PreparedStatement pstate) throwsSQLException {if(pstate!=null){

pstate.close();

}

}public static void close(ResultSet rs) throwsSQLException {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:3c3p0.acquireIncrement=3#连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15c3p0.maxPoolSize=15#连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接,单位秒

c3p0.maxIdleTime=100#连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功

c3p0.acquireRetryAttempts=30#连接池在获得新连接时的间隔时间

c3p0.acquireRetryDelay=1000

2.ConnectionPool

packagecom.study.pool;importjava.sql.Connection;importjava.sql.SQLException;importjavax.sql.DataSource;importcom.mchange.v2.c3p0.ComboPooledDataSource;public classConnectionPool {privateDataSource ds;private staticConnectionPool pool;privateConnectionPool(){

ds= newComboPooledDataSource();

}public static finalConnectionPool getInstance(){if(pool==null){try{

pool= newConnectionPool();

}catch(Exception e) {

e.printStackTrace();

}

}returnpool;

}public synchronized finalConnection getConnection() {try{returnds.getConnection();

}catch(SQLException e) {

e.printStackTrace();

}return null;

}

}

3.PoolThread

packagecom.study.pool;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;public class PoolThread extendsThread {

@Overridepublic voidrun(){

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

packagecom.study.pool;public classPoolMain {/*** 数据源缓冲池 实例练习*/

public static voidmain(String[] args) {

System.out.println("缓冲池模拟开始");

PoolThread[] threads= new PoolThread[50];for(int i=0;i

threads[i]= newPoolThread();

}for(int i=0;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配置数据源

java c3p0 配置文件_【c3p0】 C3P0的三种配置方式以及基本配置项详解相关推荐

  1. C3P0的三种配置方式以及基本配置项详解

    数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. 注:需要的jar包在后面给出链接. ---------------------- ...

  2. Spring Boot项目(Maven\Gradle)三种启动方式及后台运行详解

    Spring Boot项目三种启动方式及后台运行详解 1 Spring Boot项目三种启动方法 运行Application.java类中的Main方法 项目管理工具启动 Maven项目:mvn sp ...

  3. html5边框顶格,CSS 三种定位方式以及格式化上下文详解 》 html5jscss

    常规流( Normal flow ) 之称之为常规流,是因为这是相对于后面的浮动和绝对定位的一个概念,浮动和绝对定位元素都脱离了当前的常规流. 在 CSS2.1中,常规流包括块框( block box ...

  4. 二叉树的创建与三种遍历方式(带图文详解)

    二叉树是由多节点组成的,每个节点最多链接两个节点,这两个节点就称为根节点的左树和右树. 每个节点的由数据区,左树,右树组成. typedef struct node {int data;struct ...

  5. MyEclipse网站服务器,MyEclipse中web服务器的三种配置方式

    初学Javaweb开发的人们都会遇到一个问题,就是服务器环境的搭建配置问题.下面介绍三种服务器的搭建方式. 直接修改server.xml文件 当你写了一个web应用程序(jsp/servlet),想通 ...

  6. java jndi tomcat_tomcat下jndi的三种配置方式

    Java命名和目录接口(the Java naming and directory interface,JNDI)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得读 ...

  7. Java多线程:多线程同步安全问题的 “三“ 种处理方式 ||多线程 ”死锁“ 的避免 || 单例模式”懒汉式“的线程同步安全问题

    Java多线程:多线程同步安全问题的 "三" 种处理方式 ||多线程 "死锁" 的避免 || 单例模式"懒汉式"的线程同步安全问题 每博一文 ...

  8. tomcat下jndi的三种配置方式

    jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...

  9. Spring Bean的三种配置方式

    目录 一.传统的XML配置方式 二.基于java注解的配置 三.基于类的Java Config 正文 Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java C ...

最新文章

  1. JVM性能优化, Part 2 ―― 编译器
  2. 常用汉字的unicode 编码
  3. 学生籍贯信息管理系统c语言,学生籍贯信息管理系统(c).doc
  4. KVM和qemu网络TAP模式桥接的设置
  5. html实体编码_多视角学习 | 当自动编码器“遇上”自动编码网络
  6. 两招让陌生网络访问者现出原形
  7. 合并有序数组java
  8. js 跨域的问题 (同一个主域名不同的二级域名下的跨域问题) 解决 WdatePicker.js my97日期选择控件
  9. 开启弹窗_【电脑优化】面对电脑开机“弹窗”雨,你也很无奈呀!
  10. LeetCode之 x 的平方根
  11. 凸优化第五章对偶 5.5最优性条件
  12. spring5-介绍Spring框架
  13. 医学超声成像—合成孔径法(Synthetic Aperture Methods)[1]
  14. 设计师都在用这5个免费素材网站
  15. 企业常见的5种经济活动形式用借贷记账法在资产负债表上的体现
  16. linux基础命令之一
  17. 英文字母的大小写互换,将所有都变成小写,所有都变成大写 位运算实现
  18. YUTUc++沙盒小游戏5.0(亲测可运行)
  19. ZLMediaKit Windows编译快速入门
  20. 2020年北京林业大学软件工程计算机技术复试总结帖

热门文章

  1. 【Paper】2017_Limit-Cycle-Based Decoupled Design of Circle Formation Control with Collision Avoidance
  2. 验证STIL的pattern的输入输出顺序
  3. 雅客EXCEL(4)-录入数据、超链接阻断、下拉菜单、横列转数列、alt+向下方向键、定位公式
  4. 点到点链路的滑动窗口协议
  5. Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)
  6. 小程序自动化测试--测试3
  7. IOS开发网络第一天之06线程之间的通信
  8. Android实例-手机震动(XE8+小米2)
  9. 华为机考回忆版(三:自己的)
  10. iPhone Three20软件引擎之构建开发环境与HelloWorld