1、連接池概念 用池來管理Connection,這樣可以重覆使用Connection。有了池,我們就不用自己來創建Connection,而是通過池來獲取Connection對象。當使用完Connection後,調用Connection的close()方法也不會真的關閉Connection,而是把Co ...
1、連接池概念
用池來管理Connection,這樣可以重覆使用Connection。有了池,我們就不用自己來創建Connection,而是通過池來獲取Connection對象。當使用完Connection後,調用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池,池就可以再利用這個Connection對象了。
2、自定義連接池
1)基於MySQL學習(五)——使用JDBC完成用戶表CRUD的操作,把db.properties和JDBCUtils_V3.java文件複製到當前包下
2)MyConnection.java文件
裝飾者設計模式,專門用於增強方法(此處如果不對close()做增強方法,用戶調用conn.close()將連接真正釋放,連接池將無連接可用,所以我們希望用戶調用了close()方法,連接仍歸還給連接池)
1 //1.實現同一個介面 2 public class MyConnection implements Connection{ 3 //3.定義變數 4 private Connection conn; 5 6 private LinkedList<Connection> pool; 7 8 //2.編寫一個構造方法(參數使用了面向對象的多態特性) 9 public MyConnection(Connection conn,LinkedList<Connection> pool){ 10 this.conn=conn; 11 this.pool=pool; 12 } 13 //4.書寫需要增強的方法 14 @Override 15 public void close() throws SQLException { 16 pool.add(conn); 17 } 18 /* 19 * 此方法必須覆蓋!否則會出現空指針異常 20 */ 21 @Override 22 public PreparedStatement prepareStatement(String sql) throws SQLException { 23 return conn.prepareStatement(sql); 24 } 25 …… 26 }
3)MyDataSource1.java文件
創建連接池實現數據源,並實現介面javax.sql.DataSource
1 public class MyDataSource1 implements DataSource{ 2 //1.創建一個容器用於存儲Connection對象 3 private static LinkedList<Connection> pool=new LinkedList<Connection>(); 4 //2.創建5個連接放到容器中去 5 static{ 6 for(int i=0;i<5;i++){ 7 Connection conn=JDBCUtils_V3.getConnection(); 8 //放入池子中的connection對象已經經過改造了 9 MyConnection myconn=new MyConnection(conn,pool); 10 pool.add(myconn); 11 } 12 } 13 /** 14 * 重寫獲取連接的方法 15 */ 16 @Override 17 public Connection getConnection() throws SQLException { 18 Connection conn=null; 19 //3.使用前先判斷 20 if(pool.size()==0){ 21 //3.1池子里沒有,我們再創建一些 22 conn=JDBCUtils_V3.getConnection(); 23 pool.add(conn); 24 } 25 //4.從池子裡面獲取一個連接對象Connection 26 conn=pool.remove(0); 27 return conn; 28 } 29 …… 30 }
4)TestMyDataSource.java文件
1 public class TestMyDataSource { 2 /* 3 * 添加用戶 4 * 使用改造過後的Connection 5 */ 6 @Test 7 public void testAddUser1(){ 8 Connection conn=null; 9 PreparedStatement pstmt=null; 10 //1.創建自定義連接池對象 11 DataSource dataSource=new MyDataSource1(); 12 13 try { 14 //2.從池子中獲取連接 15 conn=dataSource.getConnection(); 16 String sql="insert tbl_user values(null,?,?)"; 17 //必須在自定義的conntection類中重寫prepareStatement(sql)語句 18 pstmt=conn.prepareStatement(sql); 19 pstmt.setString(1, "chenga"); 20 pstmt.setString(2, "123"); 21 int rows=pstmt.executeUpdate(); 22 if(rows>0){ 23 System.out.println("添加成功"); 24 }else{ 25 System.out.println("添加不成功"); 26 } 27 } catch (SQLException e) { 28 e.printStackTrace(); 29 }finally{ 30 //調用的release()方法中的close()其實是MyConnection的close()方法,該方法內部將當前連接歸還到連接池 31 JDBCUtils_V3.release(conn,pstmt,null); 32 } 33 } 34 }
執行Junit Test,效果如下: