>  기사  >  Java  >  Java의 데이터베이스 연결 풀 c3p0 구성에 대한 자세한 소개

Java의 데이터베이스 연결 풀 c3p0 구성에 대한 자세한 소개

黄舟
黄舟원래의
2017-08-07 10:51:112073검색

이 글에서는 주로 데이터베이스 연결 풀 c3p0 구성 관련 정보를 자세히 소개하며, 이에 관심 있는 친구들은 참고할 수 있습니다.

C3p0 구성 방법은 세 가지 유형으로 구분됩니다. 즉,

1. 세터는 각 구성을 설정합니다. 항목을 하나씩 제공합니다
2. 클래스 경로 아래에 c3p0.properties 파일을 제공합니다
3. 클래스 경로 아래에 c3p0-config.xml 파일을 제공합니다

1. Setter는 각 구성 항목을 하나씩 설정합니다

This 방법이 가장 번거롭고 양식은 일반적으로 다음과 같습니다.


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

만입니다. 가장 기본적인 구성은 항목 위에 제공되며 다른 구성 항목은 문서 구성을 참조하며 그 뒤에 속성 이름을 추가하면 됩니다. 데이터 소스를 초기화하는 마지막 방법은 다음과 같이 간단합니다.
3. 클래스 경로 아래에 c3p0-config.xml 파일을 제공하세요.


이 방법은 두 번째 방법과 비슷하지만 더 많은 장점이 있습니다

(1). Hibernate 구성과 매우 유사합니다. 및 spring

(2)은 여러 데이터 소스를 제공할 수 있습니다. 구성 방법에는 default-config와 명명된 구성이 있습니다.
다음은 구성 템플릿입니다.



private static ComboPooledDataSource ds = new ComboPooledDataSource();

public static Connection getConnection() {

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

}

default-config를 사용하려는 경우 , 데이터 소스를 초기화하는 방법은 두 번째 방법과 동일합니다. 명명된 구성에서 구성을 사용하려면 데이터 소스를 초기화하려면 매개 변수

private static ComboPooledDataSource ds = new ComboPooledDataSource( "myApp");
다음은 문서와 온라인에서 배운 c3p0 구성에 대한 이해를 요약한 것입니다(사용자, 비밀번호, 드라이버 클래스, jdbcUrl은 언급할 필요 없음)

1. 기본 구성 항목

acquireIncrement

기본값: 3

유휴 연결을 사용할 수 없을 때 연결 풀에서 한 번에 생성되는 새 데이터베이스 연결 수

initialPoolSize

기본값: 3

연결 풀이 초기화될 때 생성되는 연결 수

maxPoolSize

기본값: 15

연결 풀의 최대 연결 수입니다. 새 연결을 얻을 때 총 연결 수가 이 값을 초과하면 더 이상 새 연결을 얻지 못하고

다른 연결이 생길 때까지 기다립니다. 해제되었으므로 이 값은 매우 크게 설계될 수 있습니다.

maxIdleTime

기본값: 0 단위 s

연결의 최대 유휴 시간입니다. 이 시간을 초과하면 특정 데이터베이스 연결이 이루어지지 않은 것입니다. 연결이 끊어집니다

0이면 연결이 절대로 끊어지지 않습니다

minPoolSize
기본값: 3
연결 풀에서 유지하는 최소 연결 수와 이에 따른 maxIdleTimeExcessConnections를 함께 사용하여 연결 풀 부하를 완화합니다.


2. 연결 풀의 크기와 연결 수명을 관리합니다.

maxConnectionAge

기본값: 0개 s

이 시간을 초과하는 연결은 자동으로 끊어지고 삭제됩니다. 연결 풀에 의해. 물론, 사용 중인 연결은 즉시 끊어지지 않고, 닫힐 때까지 기다린 후 연결을 끊습니다. 0으로 구성하면 연결 수명에 제한이 없습니다.

maxIdleTimeExcessConnections

기본값: 0 단위 s

이 구성은 주로 연결 풀의 부하를 줄이기 위한 것입니다. 예를 들어 연결 풀의 연결 수는 특정 데이터 액세스 피크로 인해 많은 데이터 연결을 생성합니다.

그러나 나중에 필요합니다. 데이터베이스 연결 수가 매우 적기 때문에 현재로서는 연결 풀에서 그렇게 많은 연결을 유지할 필요가 없으므로 부하를 줄이기 위해 일부 연결을 끊고 삭제해야 합니다. , 이는 maxIdleTime보다 작아야 합니다. 구성이 0이 아닌 경우 연결 풀의 연결 수는 minPoolSize로 유지됩니다.

이 0이면 처리되지 않습니다.

maxIdleTime도 이 범주에 속할 수 있으며 이전에 작성되었습니다.

3. 구성 연결 테스트: 연결 풀에 있는 데이터베이스 연결은 몇 시간 동안 연결을 유지할 가능성이 높기 때문에 데이터베이스 서버 문제, 네트워크 문제 등으로 인해 실제 연결이 무효화되었을 가능성이 매우 높습니다. 연결 풀의 연결은 여전히 ​​유효하며 이때 연결을 얻으면 반드시 예외가 발생하므로 연결 테스트를 통해 연결의 유효성을 확인해야 합니다.

아래 처음 3개 항목은 연결 테스트 방법을 구성하는 데 사용되며, 마지막 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(); 
  } 
 } 
 
}

위 내용은 Java의 데이터베이스 연결 풀 c3p0 구성에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.