この記事では主にデータベース接続プール c3p0 構成の関連情報を詳しく紹介します。興味のある方は参考にしてください。
C3p0 構成方法は 3 つのタイプに分かれています。1. 設定者は各構成を設定します。項目を 1 つずつ設定します
2. クラスパスの下に c3p0.properties ファイルを提供します
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 番目の方法と似ていますが、より直感的でわかりやすいです
(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 については言及する必要はありません)
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 つの項目は接続テストのタイミングを設定するために使用されます。
automaticTestTabledefault: null
このテーブルは 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 サイトの他の関連記事を参照してください。