クラスの使用を検出する代わりに、java.sql.Connection
プロキシを使用してそれらの生成を検出できますか? 工場から接続を取得したら、プロキシでラップします。プロキシは、メソッド呼び出し、クエリ文字列のログ、および/createStatement()
または他の制限外呼び出しを使用している場合のスタック トレースのレポートを実行できるように設定されます。
public class ProxyConnection implements Connection {
private Connection realConnection;
public ProxyConnection(Connection realConnection) {
this.realConnection = realConnection;
}
public Statement createStatement() throws SQLException {
// could the offenders
createCounter.incrementAndGet();
// log the callers -- expensive so maybe every 100th or every 10 secs
logger.info("call to createStatment", new Exception("createStatement"));
// maybe just throw
if (throwOnBadCall) {
throw new SQLException("calls to createStatement aren't allowed"));
}
return realConnection.createStatement();
}
本番環境で重くなりすぎたくない場合は、常にそれらをカウントし、volatile boolean logBadCall
問題を探してサンプリングするための一定期間のチェックのみを有効にするフラグのタイプを使用できます。おそらく、最初にサンプリングを行い、80% の場所を攻撃し、アプリケーションのクエリ負荷の高い部分を処理したときにのみ、検出を永続的にオンにします。
接続をラップする中央の場所がない場合は、接続プールまたはファクトリをチェーンの少し上にラップする必要がある場合があります。
お役に立てれば。