Как переопределить некоторые из методов java.sql.connection, таких как prepareStatement createStatement или prepareCall? - PullRequest
0 голосов
/ 27 июня 2019

Я хочу переопределить некоторые методы в интерфейсе соединения, чтобы закрыть подготовленные состояния и наборы результатов при вызове фиксации объекта соединения. В моей кодовой базе много утечек ресурсов, и, как отказоустойчивый, я хотел реализовать это решение, где при каждом коммите я мог искать все открытые операторы и наборы результатов и закрывать их.

В этом случае, однако, у меня нет класса для переопределения и вызова super () для всех других методов. Объектом, возвращаемым в качестве соединения, является динамический прокси - com.sun.proxy. $ Proxy. Не уверен, как вызвать мои собственные методы для этого объекта. Любое руководство высоко ценится.

PS: я использую jar ojdbc8 в проекте, который был недавно обновлен с ojdbc7. Насколько я знаю, мы никогда не сталкивались с проблемами утечки ресурсов (например, превышено максимальное количество открытых курсоров) в предыдущей версии.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Если вы просто пытаетесь найти утечки, почему бы не использовать вместо этого отладчик? Вы можете установить точки останова для каждого из соответствующих методов и посмотреть, где они вызваны, а затем сделать шаг вперед, чтобы убедиться, что они закрыты должным образом. В качестве дополнительного преимущества, если есть какие-либо крайние случаи, которые мешают правильному закрытию, вы просто пошагово просматриваете соответствующий код, чтобы вы могли выяснить, что нужно исправить гораздо быстрее.

0 голосов
/ 28 июня 2019

Является ли ваша библиотека JDBC открытым исходным кодом? Затем загрузите исходные коды версии JDBC, внесите одно изменение в код, снова сгенерируйте JAR и используйте его вместо этого. Когда вы делаете это, проблема заключается в том, что все «закрытые» вызовы в вашем коде больше не являются законными классами закрытия, а являются избыточными вызовами, в таком случае я не знаю, собирается ли JDBC вызвать еще одно исключение (что-то вроде 'соединение уже закрыто') или нет, но если да, необходимо исключить исключение или что-то в этом роде.

Но основная идея здесь в том, что вы модифицируете источники, и это довольно рискованно.

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

Таким образом, вместо того, чтобы делать подобные вещи и предлагать новые проблемы, лучше принять тот факт, что кто-то в прошлом делал какую-то паршивую работу, и мы исправляем это сейчас правильным образом.

Я знаю, что это именно то, чего вы пытаетесь здесь избежать, тогда я думаю, что вы должны попробовать изменить источники JDBC и дать ему шанс. Всего наилучшего!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...