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  このファイル名が必要です.
    この文書に上記の項目を配置します.
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