数据库连接池c3p0配置_动力节点Java学院整理

c3p0的配置方式分为三种,分别是

1.setters一个个地设置各个配置项
2.类路径下提供一个c3p0.properties文件
3.类路径下提供一个c3p0-config.xml文件

1.setters一个个地设置各个配置项

这种方式最繁琐,形式一般是这样:

Properties props = new Properties();

InputStream in = ConnectionManager.class.getResourceAsStream("/c3p0.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"));

因为繁琐,所以很不适合采用,于是文档提供了另外另种方式。

2. 类路径下提供一个c3p0.properties文件

文件的命名必须是c3p0.properties,里面配置项的格式为:

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
c3p0.user=root
c3p0.password=java

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

private static ComboPooledDataSource ds = new ComboPooledDataSource();

public static Connection getConnection() {

 try {
 return ds.getConnection();
 } catch (SQLException e) {
 throw new RuntimeException(e);
 }

}

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

这种方式使用方式与第二种差不多,但是有更多的优点
(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="myApp">
 <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>

如果要使用default-config则初始化数据源的方式与第二种一样,如果要使用named-config里面配置初始化数据源,则只要使用一个带参数的ComboPooledDataSource构造器就可以了

private static ComboPooledDataSource ds = new ComboPooledDataSource("myApp");
下面整理一下从文档和网上学习到的c3p0配置的理解 (user,password,driverClass,jdbcUrl没有说的必要)

1.基本配置项

acquireIncrement

default : 3

连接池在无空闲连接可用时一次性创建的新数据库连接数

initialPoolSize

default : 3

连接池初始化时创建的连接数

maxPoolSize

default : 15

连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待

其他连接释放,所以这个值有可能会设计地很大

maxIdleTime

default : 0 单位 s
连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接
如果为0,则永远不会断开连接

minPoolSize
default : 3
连接池保持的最小连接数,后面的maxIdleTimeExcessConnections跟这个配合使用来减轻连接池的负载

2.管理连接池的大小和连接的生存时间

maxConnectionAge

default : 0 单位 s

配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待

它close再断开。配置为0的时候则不会对连接的生存时间进行限制。

maxIdleTimeExcessConnections

default : 0 单位 s

这个配置主要是为了减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接

但是后面的时间段需要的数据库连接数很少,则此时连接池完全没有必要维护那么多的连接,所以有必要将

断开丢弃掉一些连接来减轻负载,必须小于maxIdleTime。配置不为0,则会将连接池中的连接数量保持到minPoolSize。

为0则不处理。

maxIdleTime也可以归属到这一类,前面已经写出来了。

3.配置连接测试:因为连接池中的数据库连接很有可能是维持数小时的连接,很有可能因为数据库服务器的问题,网络问题等导致实际连接已经无效,但是连接池里面的连接还是有效的,如果此时获得连接肯定会发生异常,所以有必要通过测试连接来确认连接的有效性。
下面的前三项用来配置如何对连接进行测试,后三项配置对连接进行测试的时机。

automaticTestTable

default : null

用来配置测试连接的一种方式。配置一个表名,连接池根据这个表名创建一个空表,

并且用自己的测试sql语句在这个空表上测试数据库连接

这个表只能由c3p0来使用,用户不能操作,同时用户配置的preferredTestQuery 将会被忽略。

preferredTestQuery

default : null

用来配置测试连接的另一种方式。与上面的automaticTestTable二者只能选一。

如果要用它测试连接,千万不要设为null,否则测试过程会很耗时,同时要保证sql语句中的表在数据库中一定存在。

connectionTesterClassName

default :  com.mchange.v2.c3p0.impl.DefaultConnectionTester

连接池用来支持automaticTestTable和preferredTestQuery测试的类,必须是全类名,就像默认的那样,

可以通过实现UnifiedConnectionTester接口或者继承AbstractConnectionTester来定制自己的测试方法

idleConnectionTestPeriod

default : 0

用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它

保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL

8小时无会话的状态打破。为0则不测试。

testConnectionOnCheckin

default : false

如果为true,则在close的时候测试连接的有效性。为了提高测试性能,可以与idleConnectionTestPeriod搭配使用,

配置preferredTestQuery或automaticTestTable也可以加快测试速度。

testConnectionOnCheckout

default : false
性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能,

可以与idleConnectionTestPeriod搭配使用,

配置preferredTestQuery或automaticTestTable也可以加快测试速度。

4.配置PreparedStatement缓存

maxStatements
default : 0
连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以
这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。为0的时候不缓存,
同时maxStatementsPerConnection的配置无效。

maxStatementsPerConnection
default : 0
连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为
它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。

5.重连相关配置

acquireRetryAttempts

default : 30

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

acquireRetryDelay

default : 1000 单位ms

连接池在获得新连接时的间隔时间

breakAfterAcquireFailure
default : false

如果为true,则当连接获取失败时自动关闭数据源,除非重新启动应用程序。所以一般不用。
个人觉得上述三个没有更改的必要,但可以将acquireRetryDelay配置地更短一些

6.定制管理Connection的生命周期

connectionCustomizerClassName
default : null
用来定制Connection的管理,比如在Connection acquire 的时候设定Connection的隔离级别,或者在
Connection丢弃的时候进行资源关闭,就可以通过继承一个AbstractConnectionCustomizer来实现相关

方法,配置的时候使用全类名。有点类似监听器的作用。
例如:

import java.sql.Connection;
import com.mchange.v2.c3p0.AbstractConnectionCustomizer;

public class ConnectionCustomizer extends AbstractConnectionCustomizer{

 @Override
 public void onAcquire(Connection c, String parentDataSourceIdentityToken)
   throws Exception {
  System.out.println("acquire : " + c);
 }
 @Override
 public void onCheckIn(Connection c, String parentDataSourceIdentityToken)
   throws Exception {
  System.out.println("checkin : " + c);
 }
 @Override
 public void onCheckOut(Connection c, String parentDataSourceIdentityToken)
   throws Exception {
  System.out.println("checkout : " + c);
 }
 @Override

 public void onDestroy(Connection c, String parentDataSourceIdentityToken)

   throws Exception {

  System.out.println("destroy : " + c);

 }

}
<property name="connectionCustomizerClassName">liuyun.zhuge.db.ConnectionCustomizer</property>

7.配置未提交的事务处理

autoCommitOnClose

default : false

连接池在回收数据库连接时是否自动提交事务

如果为false,则会回滚未提交的事务

如果为true,则会自动提交事务

forceIgnoreUnresolvedTransactions

default : false

这个配置强烈不建议为true。
一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?

8.配置debug和回收Connection 一般来说事务当然由自己关闭了,为什么要让连接池来处理这种不细心问题呢?

unreturnedConnectionTimeout
default : 0 单位 s
为0的时候要求所有的Connection在应用程序中必须关闭。如果不为0,则强制在设定的时间到达后回收
Connection,所以必须小心设置,保证在回收之前所有数据库操作都能够完成。这种限制减少Connection未关闭
情况的不是很适用。为0不对connection进行回收,即使它并没有关闭。

debugUnreturnedConnectionStackTraces
default : false
如果为true并且unreturnedConnectionTimeout设为大于0的值,当所有被getConnection出去的连接
unreturnedConnectionTimeout时间到的时候,就会打印出堆栈信息。只能在debug模式下适用,因为
打印堆栈信息会减慢getConnection的速度
同第七项一样的,连接用完当然得close了,不要通过unreturnedConnectionTimeout让连接池来回收未关闭的连接。

9.其他配置项:因为有些配置项几乎没有自己配置的必要,使用默认值就好,所以没有再写出来

checkoutTimeout
default : 0
配置当连接池所有连接用完时应用程序getConnection的等待时间。为0则无限等待直至有其他连接释放
或者创建新的连接,不为0则当时间到的时候如果仍没有获得连接,则会抛出SQLException

三、示例:

示例采用第二种方式:

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();
  }
 } 

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 工厂模式_动力节点Java学院整理

    简单工厂模式 当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的Product 例如在大话设计模式P11给的运算工厂例子: public static Operation createOperate(string operate) { Operation oper = null; 12 switch (operate) { case "+": { oper = new OperationAdd(); break; } case "-": {

  • Java中的抽象工厂模式_动力节点Java学院整理

    定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 类型:创建类模式 类图: 抽象工厂模式与工厂方法模式的区别 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象.他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式则是针对的多个产品等级结构.在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类.

  • ThreadLocal使用案例_动力节点Java学院整理

    用户提出一个需求:当修改产品价格的时候,需要记录操作日志,什么时候做了什么事情. 想必这个案例,只要是做过应用系统的小伙伴们,都应该遇到过吧?无外乎数据库里就两张表:product 与 log,用两条 SQL 语句应该可以解决问题: update product set price = ? where id = ? insert into log (created, description) values (?, ?) But!要确保这两条 SQL 语句必须在同一个事务里进行提交,否则有可能 u

  • ocp开闭原则_动力节点Java学院整理

    开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的.灵活的系统. 定义: 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. Softeware entities like classes,modules and functions should be open for extension but closed for modifications. 开闭原则的含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有代码

  • 迪米特法则_动力节点Java学院整理

    定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合. 自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚.无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率.低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?那正是迪米特法则要去完成的. 迪米特法则又叫最少知道原则,最早是在1987年由美国Northeastern Un

  • 数据库连接池c3p0配置_动力节点Java学院整理

    c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件 1.setters一个个地设置各个配置项 这种方式最繁琐,形式一般是这样: Properties props = new Properties(); InputStream in = ConnectionManager.class.getResourceAsStream("/c3p0.properties&q

  • Java concurrency线程池之线程池原理(二)_动力节点Java学院整理

    线程池示例 在分析线程池之前,先看一个简单的线程池示例. import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; public class ThreadPoolDemo1 { public static void main(String[] args) { // 创建一个可重用固定线程数的线程池 ExecutorService pool = Executors.newFixedThre

  • Java数据库连接池之c3p0简介_动力节点Java学院整理

    c3p0是什么 c3p0的出现,是为了大大提高应用程序和数据库之间访问效率的. 它的特性: 编码的简单易用 连接的复用 连接的管理 说到c3p0,不得不说一下jdbc本身,c3p0愿意就是对数据库连接的管理,那么原有的概念还是得清晰:DriverManager.Connection.StateMent.ResultMent. jdbc:java database connective这套API,不用多说,是一套用于连接各式dbms或连接桥接器的api,两个层级:上层供应用方调用api,下层,定义

  • Java concurrency线程池之线程池原理(一)_动力节点Java学院整理

    ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存放一定数量线程的一个线程集合.线程池允许若个线程同时允许,允许同时运行的线程数量就是线程池的容量:当添加的到线程池中的线程超过它的容量时,会有一部分线程阻塞等待.线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理." ThreadPoolExecutor数据结构 ThreadPoolExecutor的数据结构如下图所示: 各个数据在Thread

  • Java concurrency线程池之线程池原理(四)_动力节点Java学院整理

    拒绝策略介绍 线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施. 当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭.第二,任务数量超过线程池的最大限制. 线程池共包括4种拒绝策略,它们分别是:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy和DiscardPolicy. AbortPolicy         -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException

  • 约定优于配置_动力节点Java学院整理

    开始尝试使用Maven构建项目的时候,惊讶于只需要简单的几行xml就可以完成原来ant需要大量xml才能完成的工作.不得不说,人们在经过一定技术积累后,总能想到办法简化自己的工作.以前做项目,总是写Ant配置文件,满足于自己更灵活的配置,而没有去思考,这么做到底值不值得. 想象一下,如果我们每个人都满足于自己的私欲,为所欲为,我们的世界会乱成什么样子?在软件世界里,如果每个程序员都定义一套自己的规范,那么我们的软件会乱成什么样子?各个版本的浏览器就已经让众多程序员头痛不已了,更别提其他的了.想到

  • redis安装和配置_动力节点Java学院整理

    在Ubuntu上安装Redis 要安装Redis在Ubuntu上,打开终端,然后键入以下命令: $sudo apt-get update $sudo apt-get install redis-server 这将在您的计算机上安装Redis. 启动Redis $redis-server 检查Redis是否在工作? $redis-cli 这将打开一个Redis提示,如下图所示: redis 127.0.0.1:6379> 在上面的提示127.0.0.1是本机的IP地址,6379是Redis服务器运

  • Java concurrency线程池之线程池原理(三)_动力节点Java学院整理

    线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态.线程池也有5种状态:然而,线程池不同于线程,线程池的5种状态是:Running, SHUTDOWN, STOP, TIDYING, TERMINATED. 线程池状态定义代码如下: private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE - 3

  • mybatis简介与配置_动力节点Java学院整理

    MyBatis简介 MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架.MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获.MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型.Map 接口和POJO 到数据库记录.相对Hibernate和Apache OJB等"一站式"ORM解决方案而言,Mybatis 是一种"半自动化"的ORM实现. 需要使用的Jar包:mybatis-3.0.2.jar(mybatis核心包

  • bootstrap基本配置_动力节点Java学院整理

    Bootstrap 安装是非常容易的.本章将讲解如何下载并安装 Bootstrap,讨论 Bootstrap 文件结构,并通过一个实例演示它的用法. 实例采用的是百度的静态资源库上的Bootstrap资源. <!-- 新 Bootstrap 核心 CSS 文件 --> <link href="http://apps.bdimg.com/libs/bootstrap/3.2.0/css/bootstrap.min.css" rel="external nofo

随机推荐