Вместо того, чтобы обнаруживать использование классов, вы могли бы вместо этого обнаруживать их генерацию с помощью 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% местоположений, а затем постоянно обнаруживаете, только когда позаботились о частях вашего приложения с высокой загрузкой запросов.
Если у вас нет центрального расположения, чтобы обернуть соединение, вам, возможно, придется немного обернуть пул соединений или заводскую цепочку.
Надеюсь, это поможет.