2014-10-02 3 views
3

Использование Spring JdbcTemplate, я пытался выяснить, как можно очистить исключения в слое DAO, но, похоже, не может понять это. Я хочу зарегистрировать SQL-оператор, который был использован и параметров.Spring JdbcTemplate как регистрировать параметры на исключениях?

Например, где addStoreSql является Параметризированным заявлении,

public int addStore(Store store) { 
    return jdbcTemplate.update(addStoreSql, store.getId(), store.getName());   
} 

я делаю что-то вроде ..

public int addStore(Store store) { 
    try{ 
     return jdbcTemplate.update(addStoreSql, store.getId(), store.getName());   
    } catch (DataAccessException ex) { 
     logger.error("exception on deleting store - " + store.toString(), ex); 
     throw ex; 
    } 
} 

Моим вопрос, есть ли способ, чтобы написать это чище во многом дао методы? Возможно, на уровне регистратора или в библиотеке Spring? Или это самый чистый способ (или код выше, даже плохой)?

У меня есть несколько методов, которые выполняют в основном одно и то же, принимают объект, передают поля в запрос и возвращают результат.

+0

Я думаю, что вопрос, который я обозначил как дубликат, должен ответить на ваш вопрос. вероятно, самым общим решением является использование прокси-драйвера (p6spy или log4jdbc), на который распространяется ответ Balus.я не люблю catch-log-rethrow, регистрируя исключения более одного раза в каждом случае, что делает журналы более трудными для чтения. –

+0

Ну, эта ссылка предназначена для стандартных библиотек java jdbc, о которых я знал. Но мой вопрос связан с библиотеками _Spring_. Я чувствую, что, возможно, что-то не хватает, возможно, используя АОП? Или, может быть, какая-то функция регистрации Spring, которая не входит в стандартную java-библиотеку java. –

+0

Я так не думаю, но было бы интересно посмотреть. Добавьте это разъяснение к вопросу (сделайте его более явным), и я снова открою. –

ответ

6

Сложность этого с Spring заключается в том, что объекты JDBC, из которых вы хотели бы получить эту информацию, не являются объектами, управляемыми Spring, они созданы драйвером. Поэтому Spring AOP не будет применяться (без использования AspectJ).

Spring может предоставить запрос и параметры отдельно для вас, если вы входите в категорию «org.springframework.jdbc.core.JdbcTemplate» на уровне DEBUG и «org.springframework.jdbc.core.StatementCreatorUtils» на уровне TRACE.

Существуют существующие библиотеки log4jdbc и p6spy, которые реализуют оболочку вокруг драйвера JDBC, чтобы сгенерировать инструкцию SQL с введенными параметрами. See this question. Использование любого из них должно заключаться в том, чтобы добавить банку в проект, изменив URL-адрес jdbc, чтобы указать на обертку, и настроить регистрацию, чтобы получить требуемый уровень информации.

Существующий код регистрации не является хорошим, потому что это повторяющийся код cut-n-paste, и это приведет к тому, что исключения будут регистрироваться несколько раз. Журналы будут сложнее читать и будут катиться чаще.

+0

Ahh Я вижу. Хорошо, это немного более громоздко, чем я надеялся, но мог бы привести меня к тому, что я ищу. благодаря –

0

Определенно не использовать этот шаблон:

logger.error("exception on deleting store - " + store.toString(), ex); 
    throw ex; 

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

EDIT

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

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

+0

Не могли бы вы подробнее рассказать об этом? Есть ли у вас какая-либо ссылка на то, как это сделать «Spring» или есть что-то в log4j, которое я должен настроить? Просто нужно немного, чтобы начать меня, я не мог найти что-нибудь в Интернете, но я, возможно, искал неправильно. –

+0

@JustinM Я обновил свой ответ – luboskrnac