ホームページ  >  記事  >  Java  >  Java でのデータベース接続プール c3p0 構成の詳細な紹介

Java でのデータベース接続プール c3p0 構成の詳細な紹介

黄舟
黄舟オリジナル
2017-08-07 10:51:112128ブラウズ

この記事では主にデータベース接続プール c3p0 構成の関連情報を詳しく紹介します。興味のある方は参考にしてください。

C3p0 構成方法は 3 つのタイプに分かれています。1. 設定者は各構成を設定します。項目を 1 つずつ設定します
2. クラスパスの下に c3p0.properties ファイルを提供します

3. クラスパスの下に c3p0-config.xml ファイルを提供します



1. Setter は各構成項目を 1 つずつ設定します

これ方法は最も面倒で、フォームは一般に次のとおりです:

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 ファイルを提供します


この方法は 2 番目の方法と似ていますが、より直感的でわかりやすいです

(1)。 spring

(2) は複数のデータソースを提供し、default-config とnamed-config の 2 つの設定方法があります。
以下は設定テンプレートです:


private static ComboPooledDataSource ds = new ComboPooledDataSource();

public static Connection getConnection() {

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

}

default-config を使用したい場合、データ ソースを初期化する方法は 2 番目の方法と同じです。named-config の構成を使用する場合は、パラメーターを指定して ComboPooledDataSource コンストラクターを使用するだけです

private static ComboPooledDataSource ds = new ComboPooledDataSource( "myApp");
以下はドキュメントやオンラインから学んだ c3p0 設定の理解をまとめたものです (user、Password、driverClass、jdbcUrl については言及する必要はありません)


1. 基本的な設定項目

acquireIncrement

デフォルト: 3

使用可能なアイドル接続がないときに接続プールによって一度に作成される新しいデータベース接続の数initialPoolSize

デフォルト: 3

接続プールの初期化時に作成される接続の数

maxPoolSize

デフォルト: 15

新しい接続を取得するときに接続の合計数がこの値を超える場合、新しい接続は取得されませんが、

他の接続が取得されるまで待機します。リリースされたため、この値は非常に大きくなるように設計されている可能性があります

maxIdleTime

デフォルト: 0 単位 s

接続の最大アイドル時間。この時間を超えると、特定のデータベース接続が使用されなくなります。接続が切断されます

0 の場合、接続は切断されません

minPoolSize

デフォルト: 3

接続プールによって維持される接続の最小数、および後続の maxIdleTimeExcessConnections は、接続プールの負荷を軽減するためにこれと組み合わせて使用​​されます




2. 接続プールのサイズと接続の有効期間を管理します


maxConnectionAge

デフォルト: 0 単位s

この時間を超える接続は自動的に切断され、破棄されます。接続プールによって。もちろん、使用中の接続はすぐには切断されませんが、接続が閉じるのを待ってから切断されます。 0 に設定すると、接続の有効期間に制限はありません。 maxIdleTimeExcessConnections

デフォルト: 0 ユニット

この構成は、主に接続プールの負荷を軽減するためのものです。たとえば、接続プール内の接続数により、特定のデータ アクセスのピークにより大量のデータ接続が作成されます

しかし、これは後の期間で必要になります。データベース接続の数は非常に少ないため、現時点では接続プールがそれほど多くの接続を維持する必要はないため、負荷を軽減するために一部の接続を切断して破棄する必要があります。 、これは maxIdleTime より小さくなければなりません。構成が 0 でない場合、接続プール内の接続数は minPoolSize に維持されます。

が0の場合は処理されません。

maxIdleTime もこのカテゴリに分類される可能性があり、これについては以前に記述しました。

3. 接続テストの設定: 接続プール内のデータベース接続は数時間接続を維持する可能性が高いため、データベース サーバーの問題やネットワークの問題などにより実際の接続が無効になっている可能性が非常に高いですが、コネクションプール内のコネクションはまだ有効ですが、この時点でコネクションを取得すると必ず例外が発生するため、コネクションをテストしてコネクションの正当性を確認する必要があります。

以下の最初の 3 つの項目は接続テストの方法を設定するために使用され、最後の 3 つの項目は接続テストのタイミングを設定するために使用されます。

automaticTestTable

default: null

テスト接続を構成する方法。テーブル名を設定します。接続プールはこのテーブル名に基づいて空のテーブルを作成します

そして、独自のテスト SQL ステートメントを使用して、この空のテーブルでデータベース接続をテストします


このテーブルは c3p0 によってのみ使用でき、ユーザーは操作できませんそれとユーザー 設定されたpreferredTestQueryは無視されます。

preferredTestQuery

default : null

テスト接続を設定する別の方法。上記のautomaticTestTableから1つだけ選択できます。

接続のテストに使用する場合は、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。