C 3 P 0接続池使用教程
33063 ワード
転載は原文の住所を明記してください.http://www.cnblogs.com/ygj0930/p/6405861.html
プロジェクト内のアプリケーション:https://github.com/ygj0930/CoupleSpace
私たちはプロジェクトでデータベースを操作する時、毎回データベースを操作するたびに接続を作ります.操作が完了したら接続を解除します.jdbcは接続の能力を維持していないので、一定時間を超えると(約数百ミリ秒)、接続は自動的に解除されます.新しい接続には140ミリ秒ぐらいの時間がかかりますので、時間がかかります.C 3 P 0接続池を使って接続を池化し、いつでも取りに行くと、平均的に取りに10-20ミリ秒しかかかりません.これは高合併でランダムにデータベースにアクセスする時、効率の向上にとても役立ちます.
C 3 P 0接続池はあなたの構成によってN個のデータベース接続を初期化します.空きT時間後に接続が切れたら自動的にK個の接続を新規に作成します.接続池に空きがあるデータベース接続が取り扱いされるのを待ちます.私たちはdataSourse.get Connectionを通じて、スレッドプールから接続済みの空き接続を取って、データベース操作を実行することができます.この接続を切断(戻し)して、この接続の使用権を接続池に戻します.実際のデータベース接続の作成とリリースは、C 3 P 0のバックグラウンドで自動的に行われます.私たちは使用時間を取ってリリースするだけです.全コースの所要時間は10+ミリ秒で、もとの数十倍になりました.
C 3 P 0の三層式の使用を紹介します.一般的なC 3 P 0の使い方と違って、三層式はデータベース操作を三つの部分に分けています.C 3 P 0操作類C 3 P 0 Utils、一回のデータベース操作をパッケージ化したVOオブジェクトDBUtils_.BO、データベース操作類DBUtils.以下で説明します.
C 3 P 0 Utils:接続池から接続を取り、一つの接続を戻します.
ここは主にC 3 P 0接続池の使用です.ステップは以下の通りです
1:C 3 P 0ツールバッグをダウンロードする: https://sourceforge.net/projects/c3p0/files/latest/download?source=files
解凍して3つのjarパッケージを入手し、あなたのプロジェクトに導入します.
2:C 3 P 0接続池を配置します.
主に接続池を初期化する時に、いくつの接続を確立しますか?接続池は最低何個までの接続ができますか?各接続の生存時間、接続池は同時にどれぐらいの操作を許可しますか?また、具体的なデータベース接続の構成:データベースのドライバ、データベースのURL、データベースの登録名、データベースのパスワード、このデータベースの接続池の詳細な構成(初期化時の接続数、最大接続数など).一つのデータベースの接続プール構成は<named-config name=“識別”ノードで定義されています.C 3 P 0 Utilsに接続池を作成する時 「標識」 接続池の構造関数としてのパラメータが入ってくると、C 3 P 0は構成ファイルに同名のノードを見つけ、このノードの構成に従って対応する構成の接続池を作成する.設定手順は以下の通りです.
srcディレクトリの下に新しい名前を作ります. c 3 p 0-config.xml このファイル名が必要です.
この文書に上記の項目を配置します.
3:C 3 P 0 Utils類を作成し、connectionを取得し、connectionをリリースする方法を定義する.
BOクラスでは主に一つのデータベース接続、一つのSttement/Presstatement(推奨、より安全)、一つの結果セットをパッケージ化しています.このように、DAO層の一回のデータベース操作で、このboオブジェクトにカプセル化できます.直接にこのオブジェクトをデータベース操作類に転送してデータベース操作を実行すればいいです.操作が完了した結果集もこのboオブジェクトに封入されています.抽出結果が必要な場所でこのboオブジェクトのrsフィールドを通じて結果抽出すればいいです.
データベースの操作類は主にデータベース操作パッケージ類のboオブジェクトの操作と接続槽の解放を行い、結果をboオブジェクトにカプセル化します.
主に5ステップに分けます
1:接続池datasourse、bo、utilsオブジェクトを作成します.
2:boオブジェクトの接続は接続池で取ったので、bo.co nn=C 3 P 0 Utils.get Connection()
3:データベース操作文sqlを定義し、boオブジェクトのpreparstatementで前処理する.
4:パッケージされたデータベース操作のboオブジェクトをutilsオブジェクトに転送してデータベース操作を実行します.
5:boオブジェクトは接続を解除して、次の接続を取得します.(クエリー操作にはリリースが必要です.)
転載先:https://www.cnblogs.com/ygj0930/p/6405861.html
プロジェクト内のアプリケーション:https://github.com/ygj0930/CoupleSpace
私たちはプロジェクトでデータベースを操作する時、毎回データベースを操作するたびに接続を作ります.操作が完了したら接続を解除します.jdbcは接続の能力を維持していないので、一定時間を超えると(約数百ミリ秒)、接続は自動的に解除されます.新しい接続には140ミリ秒ぐらいの時間がかかりますので、時間がかかります.C 3 P 0接続池を使って接続を池化し、いつでも取りに行くと、平均的に取りに10-20ミリ秒しかかかりません.これは高合併でランダムにデータベースにアクセスする時、効率の向上にとても役立ちます.
C 3 P 0接続池はあなたの構成によってN個のデータベース接続を初期化します.空きT時間後に接続が切れたら自動的にK個の接続を新規に作成します.接続池に空きがあるデータベース接続が取り扱いされるのを待ちます.私たちはdataSourse.get Connectionを通じて、スレッドプールから接続済みの空き接続を取って、データベース操作を実行することができます.この接続を切断(戻し)して、この接続の使用権を接続池に戻します.実際のデータベース接続の作成とリリースは、C 3 P 0のバックグラウンドで自動的に行われます.私たちは使用時間を取ってリリースするだけです.全コースの所要時間は10+ミリ秒で、もとの数十倍になりました.
C 3 P 0の三層式の使用を紹介します.一般的なC 3 P 0の使い方と違って、三層式はデータベース操作を三つの部分に分けています.C 3 P 0操作類C 3 P 0 Utils、一回のデータベース操作をパッケージ化したVOオブジェクトDBUtils_.BO、データベース操作類DBUtils.以下で説明します.
C 3 P 0 Utils:接続池から接続を取り、一つの接続を戻します.
ここは主にC 3 P 0接続池の使用です.ステップは以下の通りです
1:C 3 P 0ツールバッグをダウンロードする: https://sourceforge.net/projects/c3p0/files/latest/download?source=files
解凍して3つのjarパッケージを入手し、あなたのプロジェクトに導入します.
2:C 3 P 0接続池を配置します.
主に接続池を初期化する時に、いくつの接続を確立しますか?接続池は最低何個までの接続ができますか?各接続の生存時間、接続池は同時にどれぐらいの操作を許可しますか?また、具体的なデータベース接続の構成:データベースのドライバ、データベースのURL、データベースの登録名、データベースのパスワード、このデータベースの接続池の詳細な構成(初期化時の接続数、最大接続数など).一つのデータベースの接続プール構成は<named-config name=“識別”ノードで定義されています.C 3 P 0 Utilsに接続池を作成する時 「標識」 接続池の構造関数としてのパラメータが入ってくると、C 3 P 0は構成ファイルに同名のノードを見つけ、このノードの構成に従って対応する構成の接続池を作成する.設定手順は以下の通りです.
srcディレクトリの下に新しい名前を作ります. c 3 p 0-config.xml このファイル名が必要です.
この文書に上記の項目を配置します.
xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="initialPoolSize">10property>
<property name="maxIdleTime">30property>
<property name="maxPoolSize">100property>
<property name="minPoolSize">10property>
<property name="maxStatements">200property>
default-config>
<named-config name="mysql">
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/CoupleSpaceproperty>
<property name="user">rootproperty>
<property name="password">rootproperty>
<property name="initialPoolSize">10property>
<property name="maxIdleTime">30property>
<property name="maxPoolSize">100property>
<property name="minPoolSize">10property>
<property name="maxStatements">200property>
named-config>
......
......
......
c3p0-config>
より細かいのは以下のような構成があります.
<property name="acquireIncrement">3property>
<property name="acquireRetryAttempts">30property>
<property name="acquireRetryDelay">1000property>
<property name="autoCommitOnClose">falseproperty>
<property name="automaticTestTable">Testproperty>
<property name="breakAfterAcquireFailure">falseproperty>
<property name="checkoutTimeout">100property>
<property name="connectionTesterClassName">property>
<property name="factoryClassLocation">nullproperty>
<property name="forceIgnoreUnresolvedTransactions">falseproperty>
<property name="idleConnectionTestPeriod">60property>
<property name="initialPoolSize">3property>
<property name="maxIdleTime">60property>
<property name="maxPoolSize">15property>
<property name="maxStatements">100property>
<property name="maxStatementsPerConnection">property>
<property name="numHelperThreads">3property>
<property name="overrideDefaultUser">rootproperty>
<property name="overrideDefaultPassword">passwordproperty>
<property name="password">property>
<property name="preferredTestQuery">select id from test where id=1property>
<property name="propertyCycle">300property>
<property name="testConnectionOnCheckout">falseproperty>
<property name="testConnectionOnCheckin">trueproperty>
<property name="user">rootproperty>
<property name="usesTraditionalReflectiveProxies">falseproperty>
(別の:propertiesファイルでC 3 P 0を配置してみたことがあります.set Proptiesメソッドで接続池の属性を設定することができません.一つの属性をsetXXX(properties.get)に設定してから設定することができます.接続池自体にはpropertiesという属性があります.そしてset Protperties(XX)を呼び出します.方法は、このプロファイルを読み込んで、このプロファイルのkey-valueを抽出し、接続池の該当属性に設定するのではなく、設定ファイルを接続池のproperties属性に割り当てただけです.したがって、手動でこのファイルをロードし、各属性を接続池に設定する必要があります.ここではxmlファイルで配置すれば、C 3 P 0は接続を作成します.プールは自動的にこのファイルの構成によって作成されますので、設定は有効です.)3:C 3 P 0 Utils類を作成し、connectionを取得し、connectionをリリースする方法を定義する.
public class C3p0Utils {
static org.apache.log4j.Logger logger=org.apache.log4j.Logger.getLogger(C3p0Utils.class.getName());
//
static ComboPooledDataSource dataSource=new ComboPooledDataSource("mysql");
//
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (Exception e) {
logger.error("Exception in C3p0Utils!", e);
throw new MyError(" !", e);
}
}
//
public static void close(Connection conn,PreparedStatement pst,ResultSet rs){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
logger.error("Exception in C3p0Utils!", e);
throw new MyError(" !", e);
}
}
if(pst!=null){
try {
pst.close();
} catch (SQLException e) {
logger.error("Exception in C3p0Utils!", e);
throw new MyError(" !", e);
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
logger.error("Exception in C3p0Utils!", e);
throw new MyError(" !", e);
}
}
}
}
DBUtils_を作成しますBOクラスは一回のデータベース操作をカプセル化します.BOクラスでは主に一つのデータベース接続、一つのSttement/Presstatement(推奨、より安全)、一つの結果セットをパッケージ化しています.このように、DAO層の一回のデータベース操作で、このboオブジェクトにカプセル化できます.直接にこのオブジェクトをデータベース操作類に転送してデータベース操作を実行すればいいです.操作が完了した結果集もこのboオブジェクトに封入されています.抽出結果が必要な場所でこのboオブジェクトのrsフィールドを通じて結果抽出すればいいです.
public class DBUtil_BO {
public Connection conn = null;
public PreparedStatement st = null;
public ResultSet rs = null;
public DBUtil_BO() {
super();
}
}
三:DBUtilsデータベースの操作類を作成して具体的なデータベース操作を行う.データベースの操作類は主にデータベース操作パッケージ類のboオブジェクトの操作と接続槽の解放を行い、結果をboオブジェクトにカプセル化します.
public class DBUtils {
static org.apache.log4j.Logger logger=org.apache.log4j.Logger.getLogger(DBUtils.class.getName());
private static void realseSource( Connection _conn, PreparedStatement _st,ResultSet _rs){
C3p0Utils.close(_conn,_st,_rs);
}
public static void realseSource(DBUtil_BO _vo){
if(_vo!=null){
realseSource(_vo.conn, _vo.st, _vo.rs);
}
}
// : , , , DBUtils.realseSource()
public static void executeQuery(DBUtil_BO vo)
{
try{
vo.rs = vo.st.executeQuery();
}catch (SQLException e){
realseSource(vo);
String uuid=Uuid.create().toString();
logger.error("UUID:"+uuid+", SQL : ",e);
throw new MyException("err.user.dao.jdbc",e,uuid);
}
}
// update , realseSourse()
public static void executeUpdate(DBUtil_BO vo)
{
Connection conn = vo.conn;
PreparedStatement st = vo.st;
try {
st.executeUpdate();
} catch (SQLException e) {
realseSource(conn, st, null);
String uuid=Uuid.create().toString();
logger.error("UUID:"+uuid+", SQL : ",e);
throw new MyException("err.user.dao.jdbc",e,uuid);
}
realseSource(conn, st,null );
}
}
四:プロジェクトに接続池を使用する主に5ステップに分けます
1:接続池datasourse、bo、utilsオブジェクトを作成します.
2:boオブジェクトの接続は接続池で取ったので、bo.co nn=C 3 P 0 Utils.get Connection()
3:データベース操作文sqlを定義し、boオブジェクトのpreparstatementで前処理する.
4:パッケージされたデータベース操作のboオブジェクトをutilsオブジェクトに転送してデータベース操作を実行します.
5:boオブジェクトは接続を解除して、次の接続を取得します.(クエリー操作にはリリースが必要です.)
dbBo.conn=C3p0Utils.getConnection();//
String sql = "select * from users where username=? and password=?";
dbBo.st=dbBo.conn.prepareStatement(sql);// sql
dbBo.st.setString(1, name);
dbBo.st.setString(2, pass);
// dbBo
dbUtils.executeQuery(dbBo);// ,
// dbBo
if (dbBo.rs.next()) {
uid =dbBo.rs.getInt("userid");
}
// ,
dbUtils.realseSource(dbBo);
転載先:https://www.cnblogs.com/ygj0930/p/6405861.html