標籤:drive 關閉 pack private .sql catch remove source hibernate
當我們在使用java串連資料庫的時候,要註冊驅動,.再通過"驅動管理器"擷取連線物件(Connection),當我們的程式被很多使用者訪問的時候,每次都建立一個Connection串連對 象的時候,程式會變得特別卡,這時候我們可以通過資料庫連接池來解決這個問題。
用串連池來管理Connection,這可以重複使用Connection。有了池,所以我們就不用自己來建立Connection,而是通過池來擷取Connection對象。當使用完Connection後,調 用Connection的close()方法也不會真的關閉Connection,而是把Connection“歸還”給池。池就可以再利用這個Connection對象了。
常用的串連池:
1).DBCP串連池:Apache公司的免費、開源的串連池實現。Apache公司的Tomcat伺服器內部就是採用的DBCP串連池。
2).C3P0串連池:免費、開源的。在長時間啟動並執行情況下,C3P0內部的資源釋放方面的功能要比DBCP要強大。世界主流架構:Spring架構、Hibernate架構內部
採用的就是C3P0串連池。
按照這個原理,我自己寫了一個簡易的資料庫連接池,考慮的不是很周全,僅供參考,有興趣的朋友可以定義一個邏輯更加嚴謹的串連池。
首先寫一個設定檔,將串連資料庫的資訊寫入設定檔:
1 driverClassName=com.mysql.jdbc.Driver2 url=jdbc:mysql://localhost:3306/student3 username=root4 password=123456
自訂資料庫連接池代碼:
1 package connectionpool; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 import java.util.LinkedList; 7 import java.util.Properties; 8 9 import javax.sql.DataSource;10 11 //建立一個自訂資料庫連接池;12 public class JDBCPool{13 //通過LinkedList集合來儲存Connection對象,用來類比onnection對象的重複利用過程;14 //初始化connection對象的個數;15 //定義最大的連線物件;16 //定義串連池最少需要留取的對象17 private static LinkedList<Connection> link;18 private static Properties p;19 private static int initCount=5;20 private static int maxCount=10;21 private static int minCount=1;22 //通過靜態代碼塊來實現註冊驅動;23 static{24 p= new Properties();25 try {26 p.load(JDBCPool.class.getClassLoader().getResourceAsStream("dpconfig.properties"));27 Class.forName(p.getProperty("driverClassName"));28 link = new LinkedList<Connection>();29 } catch (Exception e) {30 throw new RuntimeException();31 }32 33 }34 //通過構造方法來實現初始化的Connection對象的個數;35 //我這裡是初始化的Connection對象是5個;36 public JDBCPool(){37 for (int i = 0; i <initCount; i++) {38 try {39 this.link.addFirst(this.createConnection());40 } catch (SQLException e) {41 42 e.printStackTrace();43 }44 }45 }46 //建立Connection對象的方法,如果大於最小的建立好的Connection對象,就直接取出去;47 //如果沒有的話,就判斷是否到達最大的串連數,沒到達的話,就建立一個;48 //我沒有對不滿足兩種情況進行處理,有興趣的朋友可以嘗試一下;49 private Connection getConnetion(){50 synchronized(link){if(link.size()>minCount){51 return link.removeFirst();52 }if(link.size()<maxCount){53 try {54 return this.createConnection();55 } catch (SQLException e) {56 57 e.printStackTrace();58 }59 }60 return null;61 }62 }63 //用來建立Connection對象的64 public Connection createConnection() throws SQLException{65 return DriverManager.getConnection(p.getProperty("url"),p.getProperty("username"),p.getProperty("password"));66 }67 //回收時是將Connection取回到集合,並不是關閉68 public void free(Connection conn){69 this.link.addLast(conn);70 }71 }
Java-自訂簡單的mysql資料庫連接池