JavaWeb-JDBC接続プールとDBUtils


JDBC接続プール
従来のJDBCの操作では、接続のオブジェクトを破棄するのは特によくありません.接続の作成と破棄には時間がかかります.接続プールで最適化されたプログラムを使用できます.
プログラムが開始すると、いくつかの接続を作成し、接続プールに接続を入れることができる.ユーザが接続を使用する場合、接続プールから取得することができる.使い終わったら、接続を接続プールに戻すことができます.
一、カスタム接続プール1、SUN会社は接続プールのインタフェースを提供した.(javax.sql.DataSource).
2、接続プールを定義する:このインタフェースを実現する.
3.リストセットを使用して複数の接続先を格納する.
コード:
public class MyDataSource implements DataSource{
	//     List            .
	private List list = new ArrayList();
	//         ,       ,      list .
	public MyDataSource() {
		//    3   :
		for(int i=1;i<=3;i++){
			Connection conn = JDBCUtils.getConnection();
			list.add(conn);
		}
	}
	
	@Override
	//        :
	public Connection getConnection() throws SQLException {
		if(list.size() <= 0){
			for(int i=1;i<=3;i++){
				Connection conn = JDBCUtils.getConnection();
				list.add(conn);
			}	
		}
		Connection conn = list.remove(0);
		return conn;
	}
	
	//        :
	public void addBack(Connection conn){
		list.add(conn);
	}
...
}

二、カスタム接続プールにおける問題と解決方法
カスタム接続プールで問題が発生しましたか?1、カスタム接続プールを使用する場合は、カスタム接続プールのAPIを追加で記憶する必要があります.
2、インタフェース向けのプログラミングができるか.
カスタム接続プールの問題解決策:1、API方法を追加しないで、上記の2つの問題を解決することができます!
2、Connectionのcloseメソッドを呼び出すことができますか.Connectionのcloseメソッドを強化できるか、元の破棄は返却になります!
Javaクラスを強化する方法はいくつありますか?*1つの方法:継承の方法(使用前提:親が存在し、継承関係がある必要があります).
1、子は親を継承し、親のメソッドを複写して拡張します.
 
*2つの方法:装飾者モード(使用前提:拡張方法に特化したインタフェースが必要)
1、包装対象と包装された対象は同じインタフェースを実現しなければならない.
2、包装されたオブジェクトには、包装されたオブジェクトへの参照が必要である.
欠点:インタフェースのすべての方法を実装する必要があります.
 
*3つの方法:動的エージェントの方法(使用前提:インタフェースが必要)
1、実行時にエージェントクラスを動的に作成し、装飾と同様に強化操作を完了する.
難点:反射技術が必要です.
継承と装飾者の方法:
//               :
class Man{
	public void run(){
		System.out.println(" ....");
	}
}
 
class SuperMan extends Man{
	public void run(){
		// super.run();
		System.out.println(" ....");
	}
}
 
//                 
interface Student{
	public void study();
}
 
class Students implements Student{
	public void study() {
	    System.out.println("   ...");
	}
}
 
class Studentss implements Student{
        private Student studenter;
	public Studentss(Student studenter) {
    	    this.studenter = studenter;
	}

	public void study() {
	    System.out.println("  ...");
	    // this.student.server();
	}
}

装飾者モードを使用してConnectionを強化するcloseメソッド:
public class MyConnection implements Connection{
	private Connection conn;
	private List list;
 
	public MyConnection(Connection conn,List list) {
		this.conn = conn;
		this.list = list;
	}
 
	public void close() throws SQLException {
		list.add(conn);
	}
     ...
}
 
    getConnection  :
//        :
public Connection getConnection() throws SQLException {
	if(list.size() <= 0){
		for(int i=1;i<=3;i++){
			Connection conn = JDBCUtils.getConnection();
			list.add(conn);
		}	
	}
	Connection conn = list.remove(0);
	MyConnection myConn = new MyConnection(conn, list);//    
	return myConn;
}

三、一般的なオープンソースのデータベース接続プール
DBPP:DBPP(DataBase connection pool)、データベース接続プール.apache上のjava接続プールプロジェクトであり、tomcatで使用される接続プールコンポーネントでもあります.dbcpを単独で使用するには2つのパケットが必要である:commons-dbcp.jar,commons-pool.JArはデータベース接続を確立するのは非常に時間と資源を消費する行為であるため、接続プールを通じて予めデータベースといくつかの接続を確立し、メモリに置いておき、アプリケーションがデータベース接続を確立する必要がある場合は直接接続プールに1つ申請すればいいので、使い終わったら戻します.C 3 P 0:C 3 P 0はオープンソースのJDBC接続プールであり、データソースとJNDIバインド(Java Naming and Directory Interface、Javaネーミングとディレクトリインタフェース)を実現し、JDBC 3仕様とJDBC 2の標準拡張をサポートする.現在使用されているオープンソースプロジェクトにはHibernate,Springなどがある.Tomcat内蔵接続プール:Tomcatサーバ内蔵のデータベース接続プールを使用する制限は、1つは、このプロジェクトが一般的なJavaプロジェクトではなく、webプロジェクトでなければならないことです.2つ目は、サーバが有効になる前にデータベース接続プールを構成しなければならないことです.これは状況によって異なります.Tomcatが有効になる前にデータベース接続プールを構成していなければ、後のwebアプリケーションでは内蔵のデータベース接続プールは一般的に使用されません.結局、一般的なサーバは勝手に停止しません.実際には、Tomcatに内蔵されたデータベース接続プールを使用するのも簡単です.データベースのドライバjarパッケージ(mysql-connector-java-5.1.3.37.jarなど)をTomcatの「lib」ディレクトリの下に配置します.
一、DBCP接続プールの使用
//    :
public void demo1(){
	Connection conn = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	BasicDataSource dataSource = new BasicDataSource();
	dataSource.setDriverClassName("com.mysql.jdbc.Driver");
	dataSource.setUrl("jdbc:mysql:///web_07");
	dataSource.setUsername("root");
	dataSource.setPassword("123");
	try{
		//     :
		conn = dataSource.getConnection();
		//   SQL:
		String sql = "select * from category";
		//    SQL:
		stmt = conn.prepareStatement(sql);
		//   SQL:
		rs = stmt.executeQuery();
		while(rs.next()){
			System.out.println(rs.getInt("cid")+"   "+rs.getString("cname"));
		}
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		JDBCUtils.release(rs,stmt, conn);
	}
}
	
//      :
public void demo2(){
	Connection conn = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	Properties properties = new Properties();
		
	try{
		properties.load(new FileInputStream("src/dbcpconfig.properties"));
		DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
	        //     :
		conn = dataSource.getConnection();
		//   SQL:
		String sql = "select * from category";
		//    SQL:
		stmt = conn.prepareStatement(sql);
		//   SQL:
		rs = stmt.executeQuery();
		while(rs.next()){
			System.out.println(rs.getInt("cid")+"   "+rs.getString("cname"));
		}
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		JDBCUtils.release(rs,stmt, conn);
	}
}

DBUtilsDBUtilsはJavaプログラミングにおけるデータベース操作使用ツールであり、コンパクトで簡単で実用的である.
DBUtilsはJDBCの操作をカプセル化し、JDBCの操作を簡略化し、コードを少なく書くことができる.
DBUtilsの3つのコア機能の紹介:
1.QueryRunnerでsql文に対して操作するAPIを提供する.
2、ResultSetHandlerインタフェース、select操作を定義した後、結果セットをどのようにカプセル化するか.
3、DBUtilsクラス.これはツールクラスであり、リソースとトランザクションを閉じる方法を定義しています.
学習リンク:
C 3 P 0接続プール-->https://www.cnblogs.com/ygj0930/p/6405861.html
DBUtilsラーニング-->https://www.cnblogs.com/CQY1183344265/p/5854418.html
Tomcat内蔵接続プール-->https://www.cnblogs.com/fjdingsd/p/5273187.html