Задний план
В моем текущем проекте — серверном продукте без внешнего интерфейса с графическим интерфейсом, я пытаюсь написать лучшую поддержку обработки ошибок. Ошибки в настоящее время выводятся в журналы и обычно не читаются пользователями.
Мы используем PostgreSQL в качестве базы данных и обращаемся к ней с помощью прямых вызовов JDBC и DAO через пул базы данных. Большинство исключений, связанных с базой данных, заключены в универсальный класс DatabaseException, который реализует RuntimeException и пытается извлечь отладочную информацию и информацию о состоянии из переданного исключения. В нашем конкретном случае он будет обращаться к базовому драйверу базы данных PostgreSQL — PSQLException. До сих пор этот подход хорошо работал для получения более подробной информации о том, что вызвало ошибку базы данных, с заметным исключением, описанным ниже.
Кроме того, поскольку у нас есть очень специфические требования к производительности и устаревшей поддержке, у нас есть много пользовательских SQL, magic, которые делают отслеживание обратной трассировки стека немного более трудоемким, но не невозможным. или сложно.
Описание проблемы
Я заметил, что когда мы получаем SQLException в результате ошибочного оператора SQL, реализация драйвера не возвращает оператор SQL, вызвавший ошибку. Немного поискав, я обнаружил, что есть способ перевести драйвер PostgreSQL в режим отладки при запуске и заставить его отображать свойства внутреннего запроса. Однако для нас нежелательно запускать драйвер в режиме отладки в нашей производственной среде (и, честно говоря, я не смог понять, как перевести его в режим долбаных!).
Вопрос
Кто-нибудь еще имел дело с этой же проблемой раньше и нашел решение? Если нет, существует ли какой-то шаблон ООП для хранения информации о запросе перед выполнением, а затем присвоения этой информации сгенерированному исключению? Или большинство разработчиков просто считают, что им не нужен полный запрос для устранения проблем с базой данных? Честно говоря, мне это не нужно, потому что у меня есть полная трассировка стека, и я могу найти вызывающий запрос, но это определенно ускоряет мою отладку, так как это первое, что я вижу в журналы ошибок.