對于共享資源,有一個很著名的設(shè)計模式:
資源池(ResourcePool)。
該模式正是為了解決資源的頻繁分配﹑釋放所造成的問題。
為解決每一次請求都要創(chuàng)建一次數(shù)據(jù)庫連接,可以采用數(shù)據(jù)庫連接池技術(shù)。
數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”。
預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。
我們可以通過設(shè)定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。更為重要的是我們可以通過連接池的管理機制監(jiān)視數(shù)據(jù)庫的連接的數(shù)量﹑使用情況,為系統(tǒng)開發(fā)﹑測試及性能調(diào)整提供依據(jù)。
那麼要做好一個規(guī)范的數(shù)據(jù)源(緩沖池),就需要實現(xiàn)DataSource接口中的一些方法:
如下:
一,在自己寫 ?連接池 ? 之前,應(yīng)該先為其做好準(zhǔn)備,要用到Connection中的方法,但需要有為接下來的“緩沖池”,自己的方法,那麼就要自己定義一個類MyConnection實現(xiàn)Connection
/** * 裝飾模式的使用com.mysql.jdbc.Connection具體類 * @author beiwo *? *?
1.編寫一個類,實現(xiàn)與被裝飾器類相同的接口,裝飾器類和被裝飾器類有著相同的方法 *
?2.定義一個變量,引用被裝飾器類的實例 *
?3.定義構(gòu)造方法,把被裝飾類的實例傳遞進來,裝飾器類就獲得了被裝飾類的實例 *?
4.對應(yīng)需要重寫的方法,你自己寫你需要的實現(xiàn) *
?5.對于不需要重寫的方法,調(diào)用原來被裝飾對象的對應(yīng)方法就行。
?*/
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("連接用完");
? ? ? ? ? ? ? ? ?}
?}
}