Java開発ノート(150)C 3 P 0接続プールの使い方


JDBCは、複数のデータベースを統合して互換性を備えているだけでなく、事前報告書を利用してSQL注入の脆弱性を塞いでいる.問題は、データベース接続の管理において、通常の手順に従って、データベースを操作するたびに、コード内で手動で閉じるにしてもtry文で自動的に閉じるにしても、接続を閉じなければならないことです.データベース接続をタイムリーに閉じないと、限られたデータベースメモリが長時間消費され、無駄なシステムリソースが浪費されます.しかし、頻繁にデータベースの接続を切り替えるのも問題があり、取得操作のたびにCPUが処理しなければならないため、データベースに接続するとCPUの負担が重くなることが多い.メモリとCPUは兄弟のようなもので、いずれにしてもその中の1つに影響を与え、魚と熊の掌は兼ねられない.実は接続はスレッドの場合と似ていて、スレッドも頻繁に作成することによるリソースのオーバーヘッドが頭を悩ませている.そのためJavaは早くからスレッドプールメカニズムを設計し、事前に1つのプールにいくつかのスレッドを収容し、スレッドを使用する必要がある場合、その中から1本のスレッドを選んでタスクを実行し、タスクを完了してからスレッドを返す.このようにスレッドリソースのリサイクルを実現した.システム全体の稼働効率を効果的に向上させた.スレッドたちがスレッドプールという大家族を作った以上、接続たちも接続プールの大家族を構成することができますか?Javaはスレッドプールツールを持参しているが、類似の接続プールツールを発売できなかったため、DBCP、C 3 P 0、Proxoolなど、さまざまなサードパーティの接続プールが殺到し、その中で広く応用されている当数C 3 P 0である.C 3 P 0は、JDBC 3仕様およびJDBC 2の標準拡張をサポートするオープンソースのデータベース接続プールです.JavaエンジニアリングでC 3 P 0を使用するには、c 3 p 0-0.9.5.4.jarなどのjarパッケージをインポートするとともに、そのjarパッケージに依存するmchange-commons-java-0.2.16.jar、つまり2つのjarファイルをインポートする必要があります.C 3 P 0を使用するのは簡単で、CommoPooledDataSourceクラスの使い方をマスターすれば十分です.このクラスの一般的な方法は、setDriverClass:接続プールのデータベースドライバを設定することです.setJdbcUrl:データベースの接続先を設定します.setUser:データベースのユーザー名を設定します.setPassword:データベースのパスワードを設定します.setMaxPoolSize:接続プールのサイズの上限を設定します.setMinPoolSize:接続プールサイズの下限を設定します.setInitialPoolSize:接続プールの初期サイズを設定します.setMaxStatements:レポートの最大数を設定します.setCheckoutTimeout:接続の取得待ち時間をミリ秒単位で設定します.接続プール内のすべての接続が占有されている場合、新しい接続を取得するには、既存の接続が解放されてから空き接続を取得するまで待つ必要があります.デフォルトで0は、ずっと待っていることを示します.setMaxIdleTime:最大アイドル時間を秒単位で設定します.接続がこの時間を超えても使用されない場合は、自動的に回収されます.デフォルトで0は、タイムアウトの有無を判断しない、つまり回収しないことを示します.getConnection:接続プールから接続を取得します.close:接続プールを閉じます.接続プールを導入すると、完全なデータベース・オペレーション・プロセスは、接続プールを初期化し、接続プールから接続処理を取り出す2つの大きなステップに分解されます.次に、それぞれ説明します.
1、接続プールの初期化
このステップでは、まずC 3 P 0接続プールのオブジェクトを作成し、データベースドライバ、接続アドレス、ユーザー名、パスワード、接続プールに関する仕様パラメータなど、関連メソッドを順次呼び出して詳細なパラメータ情報を設定します.次に、C 3 P 0接続プールを初期化するコード例を示します.
private static ComboPooledDataSource dataSource; //   C3P0      
//       
private static void initDataSource() {
	dataSource = new ComboPooledDataSource(); //   C3P0   
	try {
		dataSource.setDriverClass(driver_class); //            
	} catch (PropertyVetoException e) {
		e.printStackTrace();
	}
	dataSource.setJdbcUrl(dbUrl); //           
	dataSource.setUser(dbUserName); //          
	dataSource.setPassword(dbPassword); //         
	dataSource.setMaxPoolSize(10); //           
	dataSource.setMinPoolSize(1); //           
	dataSource.setInitialPoolSize(3); //           
}

2、接続プールから一つの接続処理を取り出す
最初に接続プールのgetConnectionを呼び出して接続を取得する以外、このステップの残りの操作手順はJDBCの元のプロセスと一致しています.つまり、データベース接続を取得した後も、接続のレポートを作成し、SQL文を実行するようにレポートします.次に、接続プールを使用してデータベースを操作するコードの例を示します.
//       
private static void showRecordGroupBySex() {
	String sql = "select sex,count(1) count from teacher group by sex order by sex asc";
	//          、       、         SQL  
	try (Connection conn = dataSource.getConnection();
			Statement stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(sql)) {
		while (rs.next()) { //               
			int sex = rs.getInt("sex"); //           
			int count = rs.getInt("count"); //           
			String desc = String.format("%s   %d ;", sex==0 ? " " : " ", count);
			System.out.print(desc);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

接続プールの初期化と具体的な操作のコードを統合し、統合コードを含むテストプログラムを実行し、以下のログを見てC 3 P 0接続プールが正常に動作していることがわかります.
    2 ;    3 ;

Javaテクノロジーの詳細については、「Java開発ノート(シーケンス)章ディレクトリ」を参照してください.