データ・ソース接続プールの使用状況の監視
8501 ワード
背景
前回の「データソース接続プールが閉じていない問題Could not open JDBC Connection for transaction」の分析ソースコードはMyBatisフレームワークとSpringトランザクション管理がデータソース接続プールを自動的に閉じる機能を理解し、オンラインデータソース接続プールがいっぱいになる問題を解決した.しかし、次の可能性があります.データ・ソース接続プールの使用状況を監視し、アラームをいっぱいにする方法が必要です.
シナリオ1
ここではDruidデータソースを使用していますが、他のデータソースでは次のシナリオ2を使用できます.Druidデータソース自体にfilterがあり、データソース接続(getConnectionメソッドの呼び出し)を取得すると、すべてのfilterが順次呼び出されます.これにより、データ・ソースの初期化時にフィルタを追加して、現在の接続プールの状況を表示できます.コードは次のとおりです.
ここで、現在の接続数が最大接続数の80%を超えると、エラーログが印刷され、他の様々なアラームコードを再び追加することもできます.
シナリオ2
シナリオ2は、Druidデータソースを限定することなく、一般的なデータソースに適用することができる.核心思想は、データソースのサブクラスを継承し、接続を取得する方法を書き換え、接続を取得する前に監視するコードを実現することであり、サンプルコードは以下の通りである.
結論
シナリオ1はDruidデータソースに適用され、シナリオ2はすべてのデータソースに適用され、状況に応じて使用することができる.
前回の「データソース接続プールが閉じていない問題Could not open JDBC Connection for transaction」の分析ソースコードはMyBatisフレームワークとSpringトランザクション管理がデータソース接続プールを自動的に閉じる機能を理解し、オンラインデータソース接続プールがいっぱいになる問題を解決した.しかし、次の可能性があります.データ・ソース接続プールの使用状況を監視し、アラームをいっぱいにする方法が必要です.
シナリオ1
ここではDruidデータソースを使用していますが、他のデータソースでは次のシナリオ2を使用できます.Druidデータソース自体にfilterがあり、データソース接続(getConnectionメソッドの呼び出し)を取得すると、すべてのfilterが順次呼び出されます.これにより、データ・ソースの初期化時にフィルタを追加して、現在の接続プールの状況を表示できます.コードは次のとおりです.
List<Filter> filters = new ArrayList<Filter>();
filters.add(new FilterAdapter(){
@Override
public DruidPooledConnection dataSource_getConnection(FilterChain chain, DruidDataSource dataSource, long maxWaitMillis) throws SQLException {
int activeCount = dataSource.getActiveCount();
if (activeCount > (dataSource.getMaxActive() * 0.8)) {
log.error("Druid Warning,the current active count of Druid Connection Pool is " + activeCount + "!");
}
return chain.dataSource_connect(dataSource, maxWaitMillis);
}
});
dataSource.setProxyFilters(filters);
ここで、現在の接続数が最大接続数の80%を超えると、エラーログが印刷され、他の様々なアラームコードを再び追加することもできます.
シナリオ2
シナリオ2は、Druidデータソースを限定することなく、一般的なデータソースに適用することができる.核心思想は、データソースのサブクラスを継承し、接続を取得する方法を書き換え、接続を取得する前に監視するコードを実現することであり、サンプルコードは以下の通りである.
DruidDataSource dataSource = new DruidDataSource(){
protected Logger log = LoggerFactory.getLogger(BaqiDataSource.class);
@Override
public DruidPooledConnection getConnectionDirect(long maxWaitMillis) throws SQLException {
int activeCount = this.getActiveCount();
if (activeCount > (dataSource.getMaxActive() * 0.8)) {
log.error("Druid Warning,the current active count of Druid Connection Pool is " + activeCount + "!");
}
return super.getConnectionDirect(maxWaitMillis);
}
};
//
dataSource.setUrl("xxx");
dataSource.setUsername("xxx");
dataSource.setPassword("xxx"));
dataSource.setDriverClassName("xxx"));
...
結論
シナリオ1はDruidデータソースに適用され、シナリオ2はすべてのデータソースに適用され、状況に応じて使用することができる.