2014-10-02 2 views
3

스프링의 JdbcTemplate을 사용하여 DAO 레이어에서 예외를 기록하는 명확한 방법을 찾아 내려고했지만 그 사실을 알 수없는 것 같습니다. 난 매개 변수를 사용하는 SQL 문을 기록 싶어요. addStoreSql 매개 변수화 된 문Spring JdbcTemplate 예외에 대한 매개 변수를 기록하는 방법은 무엇입니까?

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; 
    } 
} 

내 질문이 많은 DAO에서 어떤 청소기를 작성하는 방법이 행동 양식? 아마도 로거 수준이나 일부 Spring 라이브러리에서 가능합니까? 아니면 가장 깨끗한 방법입니까? (또는 위의 코드가 좋지 않습니까?)

기본적으로 동일한 작업을 수행하는 여러 메소드가 있으며, 객체를 가져 와서 필드를 쿼리에 전달하고 결과를 반환합니다. 종종 중복에 이르게하는 경우 로그 항목을

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

때문에 :

+0

나는이 질문을 내가 귀하의 질문에 답변해야한다고 생각한다고 생각합니다. 아마도 가장 일반적인 솔루션은 Balus의 대답을 다루는 프록시 드라이버 (p6spy 또는 log4jdbc)를 사용하는 것입니다.catch-log-rethrow를 싫어하므로 발생 당 두 번 이상 예외를 기록하면 로그를 읽기가 더 어려워집니다. –

+0

그 링크는 내가 알고있는 표준 java jdbc 라이브러리를위한 링크입니다. 하지만 내 질문은 _Spring_ 라이브러리와 관련이 있습니다. AOP를 사용하여 뭔가를 놓친 것 같은 기분이 들까? 또는 표준 Java jdbc 라이브러리의 일부가 아닌 Spring의 일부 로깅 기능. –

+0

나는 그렇게 생각하지 않지만, 보는 것은 재미있을 것이다. 질문에 명확한 설명을 추가하면 (더 명확하게) 다시 열어 보겠습니다. –

답변

6

Spring에서이 작업을 수행하는 데 따르는 어려움은이 정보를 가져오고 자하는 JDBC 객체가 Spring에서 관리하는 객체가 아니라 드라이버에 의해 생성된다는 것입니다. 그래서 Spring AOP는 (AspectJ를 사용하지 않고) 적용되지 않을 것이다.

DEBUG 레벨에서 "org.springframework.jdbc.core.JdbcTemplate"카테고리를 추적하고 TRACE 레벨에서 "org.springframework.jdbc.core.StatementCreatorUtils"카테고리를 로그하면 Spring이 쿼리와 매개 변수를 별도로 제공 할 수 있습니다.

기존 라이브러리 log4jdbcp6spy은 JDBC 드라이버 주위에 래퍼를 구현하여 매개 변수가 삽입 된 SQL 문을 생성합니다. See this question. 이 중 하나를 사용하면 jar를 프로젝트에 추가하고 jdbc url을 래퍼를 가리 키도록 변경하고 로깅을 조정하여 원하는 수준의 정보를 얻을 수 있습니다.

기존의 로깅 코드는 반복되는 cut-n-paste 코드이므로 여러 번 로깅되는 예외가 발생하므로 기존 로깅 코드가 좋지 않습니다. 로그는 읽기가 어려우며 더 자주 롤됩니다.

+0

업데이트했습니다. 좋아, 이건 내가 좀더 성가신 일이지만, 내가 원하는 바를 이끌 수있다. 감사 –

0

은 확실히이 패턴을 사용하지 마십시오. 예외에 대한 일부 전역 트랩이 있어야하며 그 책임은 오류를 기록하는 것입니다.

예외 글로벌 트랩으로 편집

, 나는 모든 응용 프로그램은 자바 코드에서 (이상적으로 모든) 대부분의 예외를 잡기위한 몇 가지 메커니즘이 그들을 로그인해야합니다 것을 의미한다. 당신이 중요한 오류에 대한 로그를 포착하지 못한다고 상상해보십시오. 생산 현장에서 발생한 일을 파악하려고 할 때 시각 장애인입니다.

그럼 예외 로깅 메커니즘이 제대로 구현되어있는 것처럼 보자. 패턴이 SQL 오류를 기록하고 전역 예외 트랩에 의해 캐치되어 다시 기록되는 예외를 throw합니다. 그렇게하지 않으려면 코드에 기록하지 말고 한 줄의 코드를 저장하고 중복 된 로그 항목을 만들지 마십시오.

+0

좀 더 자세히 설명해 주시겠습니까? 이 방법을 "봄"방식으로 수행하는 방법에 대한 참조가 있습니까? 아니면 구성해야하는 log4j에있는 것이 있습니까? 조금이라도 시작해야만 온라인으로 찾을 수 없지만 잘못 찾고있을 가능성이 있습니다. –

+0

@JustinM 대답을 – luboskrnac

관련 문제