接到這麼個需求,數據庫走的全是流式查詢,導致查詢之前要先判斷是否有鏈接可用,否則就不應該將查詢放過去。
用的是多數據源,但連接池還是用的 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 來控制基本沒問題了。