Как я могу получить пользовательский объект CallableStatement из метода prepareCall? - PullRequest
1 голос
/ 01 сентября 2010

Я хочу создать подкласс, который расширяет объект CallableStatement. Я хочу сделать это, чтобы переопределить методы execute и executeQuery для отслеживания некоторых метрик при каждом вызове SP.

В настоящее время у меня есть код, который выглядит следующим образом:

Connection db = poolingDataSource.getConnection();
CallableStatement cstmt = db.prepareCall("{call pSampleStoredProc()}");
ResultSet rs = cstmt.executeQuery();

где poolingDataSource из пакета apache commons dbcp. Моя реализация подключена к базе данных MySQL с помощью JDBC.

В настоящее время метод prepareCall возвращает com.mysql.jdbc.JDBC4CallableStatement. Я хотел бы иметь возможность изменить это так, чтобы он возвращал собственный класс, который расширяет JDBC4CallableStatement, но переопределяет методы execute () и executeQuery ().

Есть идеи о том, как лучше всего это сделать?

1 Ответ

4 голосов
/ 01 сентября 2010

Если у вас есть управляемое количество мест, где вам нужно это сделать, я предлагаю простой способ сделать это (проще, чем попытаться заставить этот драйвер базы данных вернуть ваш пользовательский объект CallableStatement) - создать оболочку или декоратор обернуть объект CallableStatement, который вы получаете из базы данных. По сути, создайте класс, который реализует все методы CallableStatement, принимает объект CallableStatement в качестве параметра своему конструктору и делегирует все вызовы метода вплоть до другого объекта, за исключением того, что для execute () и executeQuery () вы также вызовите ваши методы ведения журнала до и после делегирования другим объектам метода execute ().

Конечно, есть и другие способы сделать это, но мне это показалось проще.

Connection db = poolingDataSource.getConnection();
CallableStatement cstmt = db.prepareCall("{call pSampleStoredProc()}");
MyCallableStatement mystmt = new MyCallableStatement( cstmt );
ResultSet rs = mystmt.executeQuery();
...