druid 連接池判斷是否還有可用連接

接到這麼個需求,數據庫走的全是流式查詢,導致查詢之前要先判斷是否有鏈接可用,否則就不應該將查詢放過去。

用的是多數據源,但連接池還是用的 druid,判斷方法,邏輯代碼如下。

 DynamicRoutingDataSource dynamicRoutingDataSource = (DynamicRoutingDataSource) dataSource;
 DataSource master = dynamicRoutingDataSource.getDataSource("master");
 ItemDataSource master1 = (ItemDataSource) master;
 DruidDataSource dataSource = (DruidDataSource) master1.getDataSource();
 //  當前連接池連接數(數據連接池中連接數)
 int poolingCount = dataSource.getPoolingCount();
 // 連接池連接數峯值(數據連接池中連接數的最大值)
 int poolingPeak = dataSource.getPoolingPeak();
 // 活動的,在使用的連接數, 當前活躍連接數(數據連接池中活躍連接數)
 int activeCount = dataSource.getActiveCount();
 // 活躍數峯值出現時間
 Date activePeakTime = dataSource.getActivePeakTime();
 // 活躍數峯值(連接池的最大連接數)
 int activePeak = dataSource.getActivePeak();
 
 // 已建立的連接數
 long connectCount = dataSource.getConnectCount();
 
 
 long closeCount = dataSource.getCloseCount();
 int maxActive = dataSource.getMaxActive();
 
 System.out.println("poolingCount:" + poolingCount + " activeCount:" + activeCount + " connectCount:" + connectCount);

 

測試,首先沒有任務操作的時候先進行測試。

 poolingCount:5 activeCount:0 connectCount:0

開啓一個查詢,流式查詢過程中進行再次測試。

 poolingCount:4 activeCount:1 connectCount:52 activePeak:29 closeCount:33 maxActive:50

開啓N個查詢,最終可以確定,

 if (activeCount + poolingCount >= maxActive) {
     System.out.println("已經超過連接數量,不能再加入任務了");
 }

通過這個來控制連接數量。另外加上 GetConnectionTimeoutException 來控制基本沒問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章