문제

항상 고통스러운 한 가지는 쿼리 자체 대신 준비된 상태가있을 때 SQL (JDBC) 오류를 기록하는 것입니다.

당신은 항상 다음과 같은 메시지로 끝납니다.

2008-10-20 09:19:48,114 ERROR LoggingQueueConsumer-52 [Logger.error:168] Error 
executing SQL: [INSERT INTO private_rooms_bans (room_id, name, user_id, msisdn, 
nickname) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE room_id = ?, name = ?, 
user_id = ?, msisdn = ?, nickname = ?]

물론 값을 검색하고 물음표를 실제 값으로 구문 분석/대체하기위한 도우미 방법을 작성할 수 있습니다 (이 질문의 결과를 얻지 못하면 그 길을 따라갈 것입니다). 이 문제는 다른 사람에 의해 전에 해결되었으며/또는 경우 자동으로 그렇게 할 일반 로깅 도우미가있는 경우.

몇 가지 답변 후 편집 :

지금까지 제공된 라이브러리는 디버깅 진술을 기록하는 데 적합한 것으로 보이며, 의심 할 여지없이 유용합니다. 그러나, 나는 오류가 발생할 때마다 준비 상태 (일부 서브 클래스가 아님)를 취하고 SQL 문을 기록하는 방법을 찾고 있습니다. 대체 준비를 구현하여 프로덕션 앱을 배포하고 싶지 않습니다.

준비된 전문화가 아니라 유틸리티 클래스를 찾고있는 것 같아요.

감사!

도움이 되었습니까?

해결책

나는 시도했다 log4jdbc 그리고 그것은 나를 위해 일을했습니다.

보안 참고 : 2011 년 8 월 현재로 LOG4JDBC 준비한 명세서의 기록 된 결과는 실행하기에 안전하지 않습니다. 그들은 분석에 사용될 수 있지만 DBMS로 먹이를주지 않아야합니다.

예시 logjdbc에 의해 생성 된 로그 :

2010/08/12 16:30:56 JDBC.sqlonly org.apache.commons.dbcp.delegatingpreparedstatement.executeupdate (delegatingpreparedstatement.java:105) 8. a_table (id_file, code1, id_g, id_ exceence, ref, ref, ref, ref, ref, insert, 삽입 , drink_id, 금액, 설명, 상태, code2, Reject_descr, id_cust_rej) 값 (2, '123', 1, '2', 'aa', 'awe', null, '0123', 4317.95, 'rccc', ' 0 ', null, null, null)

라이브러리는 설정하기가 매우 쉽습니다.


내 구성 HSQLDB :

jdbc.url=jdbc:log4jdbc:hsqldb:mem:sample

와 함께 신탁 :

jdbc.url=jdbc:log4jdbc:oracle:thin:@mybdd:1521:smt
jdbc.driverClass=net.sf.log4jdbc.DriverSpy

logback.xml :

<logger name="jdbc.sqlonly" level="DEBUG"/>

너무 나쁘다 그것은 Maven 저장소에 있지 않았지만 여전히 유용합니다.
내가 시도한 것에서, 당신이 설정하면

당신은 진술을 실수로 얻을 수 있지만,이 라이브러리가 성능에 영향을 미치는지 모르겠습니다.

다른 팁

이것은 매우 데이터베이스 의존적입니다. 예를 들어, 일부 JDBC 드라이버 (예 : Sybase, 아마도 MS-SQL)는 서버에 임시 저장 프로 시저를 작성하여 준비된 명세서를 처리 한 다음 해당 절차를 제공된 인수로 호출한다는 것을 이해합니다. 따라서 완전한 SQL은 실제로 클라이언트로부터 전달되지 않습니다.

결과적으로 JDBC API는 귀하가 후에 정보를 노출시키지 않습니다. 내부 드라이버 구현을 명세서 개체를 캐스팅 할 수는 있지만 아마도 AppServer는 자체 구현에 진술을 래핑 할 수 있습니다.

나는 당신이 총알을 물고 자리 표시 자 SQL에 논쟁을 보간하는 자신의 수업을 작성해야 할 수도 있다고 생각합니다. 설정된 매개 변수에 대해 준비된 상태를 요청할 수 없기 때문에 이것은 어색 할 것입니다.

운전자의 구현 객체를 감싸는 유틸리티 라이브러리 중 하나가 달성하려는 일을하는 가장 실용적인 방법이지만 어느 쪽이든 불쾌 할 것 같습니다.

사용 p6spy: Oracle, MySQL, JNDI, JMX, 그리고 Maven 친숙한. 매우 구성 가능합니다. 단순하고 낮은 수준의 통합은 인쇄 할 수 있습니다 스택 트레이스. 인쇄 할 수 있습니다 무거운 전화 - 시간을 기반으로합니다.

  1. MySQL을 사용하는 경우 MySQL Connector의 ProadingStatement.toString () 바운드 매개 변수가 포함됩니다. 타사 연결 풀이 이것을 깨뜨릴 수 있지만.

  2. 매개 변수가 추가 될 때 쿼리 문자열을 구축하기위한 서브 클래스 준비 상태. 컴파일 된 이진 형태를 사용하므로 준비된 상태에서 SQL을 추출 할 수있는 방법이 없습니다.

LoggedPreparedStatement 내가 시도하지는 않았지만 유망한 것 같습니다.

모든 쿼리를 기록하는 프록시 드라이버보다 이들의 장점 중 하나는 로그인하기 전에 쿼리 문자열을 수정할 수 있다는 것입니다. 예를 들어 PCI 환경에서는 카드 번호를 마스크 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top