併發實戰(1) 模擬等待超時模式的連線池

2021-10-07 05:40:18 字數 2626 閱讀 8912

我們來進行併發的實戰,用等待超時模式來實現連線池的功能。

不管是在spring還是mybatis中的的連線池,都是按照等待超時的思想來實現的。

接下來簡單的來實現乙個等待超時模式的連線池

什麼是等待超時模式的連線池,從名字中可以看到就是通過等待與等待超時來實現乙個連線池。連線池也就是乙個池子容器,裡面放著我們定義好的連線,在需要的時候從中取出連線,並且在使用完成後歸還接連,減少了連線建立與銷毀的效能消耗。

所以我們想實現乙個等待超時模式的連線池,需要實現以下幾步

一、建立乙個連線池類

二、定義乙個連線池容器

三、初始化連線池容器

四、定義取出連線方法

五、定義歸還連線方法

/**

* @version 1.0

* @description 資料庫連線池

* @author 殘冬十九

* @date 2020/6/15

*/public

class

dbpool}}

/** * 獲取連線

* * @param timeout 超時時間 ,0或小於0則永不超時。

* @return 獲取到的連線,超時則為空,需要處理

* @throws interruptedexception 丟擲的執行緒狀態異常

*/public connection fetchconn

(long timeout)

throws interruptedexception

// 獲取並返回第乙個鏈結

return connection_pool.

removefirst()

;}else

// 初始化為空的連線,

connection connection = null;

//走到這一步有兩種情況,一種是獲取到了連線池連線,則獲取的連線返回,一種是等待超時,返回空的連線if(

!connection_pool.

isempty()

)//返回連線

return connection;}}

}/**

* 放回資料庫連線

* * @param conn 連線

*/public

void

releaseconn

(connection conn)}}

}

這就是實現了資料庫連線池的類,在類中有

connection_pool 連線池容器

dbpool 構造方法來初始化容器

fetchconn 獲取連線

releaseconn 歸還連線

其中用到的sqlconnectimpl是自定義的乙個類,實現了connection介面,沒有做其他處理

public

class

sqlconnectimpl

implements

connection

}

從**中可以看出我們使用了wait()和notifyall()方法,這兩個方法是我們實現等待超時模式的關鍵點,wait是讓執行緒處於等待狀態,要麼是等待時間到了或者被其他執行緒喚醒,否則會一直等待下去,正是通過這個機制來完成了等待超時模式的連線池。

/**

* @version 1.0

* @description 資料庫執行緒池測試

* @author 殘冬十九

* @date 2020/6/15

*/public

class

dbpooltest

// main執行緒在此處等待,等待所有執行緒執行完畢

end.

await()

; system.out.

println

("總共嘗試了: "

+(threadcount * count));

system.out.

println

("拿到連線的次數: "

+ got)

; system.out.

println

("沒能連線的次數: "

+ notgot);}

static

class

worker

implements

runnable

@override

public

void

run(

)finally

}else

}catch

(exception ex)

finally

}//執行緒執行完後執行一次countdownlatch

從結果圖中看出,我們請求了4000次連線池,其中3975次獲取到了連線,25次連線超時了。

不管spring還是mybatis中的來連線池都是類似的實現,不過這個是比較簡單的實現,不過原理都是一樣的。

這個就是簡單的等待超時模式的連線池,希望對讀者有幫助。

高併發模擬實驗1 情景模擬

實驗目的 檢視高併發情況下資料邏輯上出現的錯誤問題 注 這裡不考慮伺服器負載等效能問題 實驗描述 假設存在商品表goods,表包含兩個字段 id,quantity,其中id為主鍵,代表商品編號,quantity代表商品庫存數量,服務端設計程式模擬購物,每購買一件 客戶端每請求一次 商品庫存就減一。在...

Java7併發程式設計實戰(一) 執行緒的等待

試想乙個情景,有兩個執行緒同時工作,還有主線程,乙個執行緒負責初始化網路,乙個執行緒負責初始化資源,然後需要兩個執行緒都執行完畢後,才能執行主線程 首先建立乙個初始化資源的執行緒 public class datasourcesloader implements runnable catch int...

Java併發程式設計實戰筆記 1 執行緒安全簡介

資源利用率 程式在等待操作執行完成的空檔,執行另乙個程式 提高資源利用率。公平性使用者對於計算機的使用權,通過粗粒度的時間分片 使得使用者和程式共享資源程式。便利 效率性 乙個任務分解多個子任務,必要時通訊共同完成任務。非同步事件的簡單處理 對於單執行緒而言,如果要高效處理多個操作,必須使用非阻塞i...