數(shù)據(jù)庫連接池

對于共享資源,有一個很著名的設(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("連接用完");

? ? ? ? ? ? ? ? ?}

?}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容