對于共享資源,有一個很著名的設計模式:
資源池(ResourcePool)。
該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。
為解決每一次請求都要創建一次數據庫連接,可以采用數據庫連接池技術。
數據庫連接池的基本思想就是為數據庫連接建立一個“緩沖池”。
預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。
我們可以通過設定連接池最大連接數來防止系統無盡的與數據庫連接。更為重要的是我們可以通過連接池的管理機制監視數據庫的連接的數量﹑使用情況,為系統開發﹑測試及性能調整提供依據。
那麼要做好一個規范的數據源(緩沖池),就需要實現DataSource接口中的一些方法:
如下:
一,在自己寫 ?連接池 ? 之前,應該先為其做好準備,要用到Connection中的方法,但需要有為接下來的“緩沖池”,自己的方法,那麼就要自己定義一個類MyConnection實現Connection
/** * 裝飾模式的使用com.mysql.jdbc.Connection具體類 * @author beiwo *? *?
1.編寫一個類,實現與被裝飾器類相同的接口,裝飾器類和被裝飾器類有著相同的方法 *
?2.定義一個變量,引用被裝飾器類的實例 *
?3.定義構造方法,把被裝飾類的實例傳遞進來,裝飾器類就獲得了被裝飾類的實例 *?
4.對應需要重寫的方法,你自己寫你需要的實現 *
?5.對于不需要重寫的方法,調用原來被裝飾對象的對應方法就行。
?*/
public class MyConnection implements Connection{ ??//1
? ? ? ? ? ? private List<Connection> ?pool;
? ? ? ? ? ? ?private Connection conn; ? ?//2 com.mysql.jdbc.Connection
//3
public MyConnection(List<Connection>pool, Connection conn) {
? ? ? ? ? ?super();
? ? ? ? ? this.pool = pool;
? ? ? ? ?this.conn = conn;
}
//4
@Overridepublic void close() throws SQLException {
? ? ? ? pool.add(conn);
}
//5
@OverridepublicT unwrap(Classiface) throws SQLException {
? ? ? return conn.unwrap(iface);
}
}
二:開始建連接池
public class MyDataSource implements DataSource{
? ? ? ? ? //Collections.synchronizedList,把集合對象變成線程安全的模式private static? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? private static List<Connection>pool=Collections.synchronizedList(new ArrayList());
? ? ? ? ?static{
? ? ? ? ? ? ? ? ? ? ? ? ?try {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? for (int i = 0; i <10; i++) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Connection conn=DBUtil.getConn();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pool.add(conn);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ?} catch (Exception e) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ?}
@Override
public Connection getConnection() throws SQLException {
? ? ? ? ? ? ? ? ? ? ?if(pool.size()>0){
? ? ? ? ? ? ? ? ? ? ? ? ? ?Connection conn=pool.remove(0);
? ? ? ? ? ? ? ? ? ? ? ? ? ?MyConnection myConn=new MyConnection(pool, conn);
? ? ? ? ? ? ? ? ? ? ? ? ? ?return myConn;
? ? ? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? ? ? ? throw new RuntimeException("連接用完");
? ? ? ? ? ? ? ? ?}
?}
}