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