'Java'에 해당되는 글 2건

  1. 2008.04.06 SQL Server JDBC 드라이버 버그..
  2. 2007.12.16 Java, PreparedStatement 쿼리문 확인하기.. (2)

기능 개선상 스토어드 프로시저가 몇개 추가되었는데, 갑자기 스토어드 프로시저 호출이 안되는거다.. 예전 스토어드 프로시저는 잘 호출되고 실행도 되는데 새로 추가된 스토어드 프로시저는 호출이 안된다.. 도대체 뭐가 문제인가.. 몇일을 끙끙 거리고 해매도 답도 안나오고..

스토어드 프로시저 내부에 select 가 2개 이상 있는 것도 아니고.. 이렇게 수정해보고, 저렇게 수정을 해봐도 해결이 안되더군..

2008/03/18 19:16:18 at ets.biz.admin.siteadmin.TestMngMgt.TestMngTO.testMngMarking2
(TestMngTO.java:500) [Debug] call proc_answer ex ( ?, '' ) start
2008/03/18 19:16:18 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run
(ThreadPool.java:683) [Error] com.microsoft.sqlserver.jdbc.SQLServerException: 서버 커서는 둘 이상의 SELECT 문이 있는 원격 저장 프로시저나 저장 프로시저에서 사용할 수 없습니다. 기본 결과 집합이나 클라이언트 커서를 사용하십시오.
    at ets.biz.admin.siteadmin.TestMngMgt.TestMngTO.testMngMarking2(TestMngTO.java:522)
    at ets.biz.admin.siteadmin.TestMngMgt.TestMngBLC.testMngMarking2(TestMngBLC.java:154)
    at ets.biz.admin.siteadmin.TestMngMgt.TestMngBLC.doTheWork(TestMngBLC.java:51)
 
에러메시지를 가지고 구글 검색을 해봤는데도 검색도 안되고.. 결국, 안되는 영어로 메시지를 영어로 바꾸어 검색을 해서 영문에 해당하는 에러메시지를 찾아냈다.. 그 메시지로 Microsoft의 MSDN 사이트에서 검색을 하니 알려진 버그라는 사실을 찾았다.. 문제는 SQL Server JDBC 드라이버의 버그였으며, 최신버젼으로 업데이트 하니 해결되었다..
 
2006년에 수정된 버그인데, 몇날 몇일을 이것 때문에 시간을 허비한 것인지.. preparedStatement를 MS SQL 2000에서 수행할때 나는 버그였다.. 2005에서는 발생하지 않았다..

Posted by 미친병아리
TAG Java, JDBC, MSSQL

자바 코딩을 할 일이 생겼는데, 쿼리문을 날리는데 Prepared Statement를 사용하면 좋다는 생각이 나서 사용해보기로 했다.. 평소엔 신경도 쓰지 않던 내용을 일도 많고 바쁜데 하필 적용시켜보겠다고 생각을 했는지는 모르겠다.. 하긴, 물론 이렇게 한다고 해서 시간이 더 걸리거나 어려운 방법은 아니다..

Prepared Statement는 DB 서버가 쿼리문을 캐쉬해두어 성능을 높일 수 있게 해주는 알고리즘을 개선 시키기 위해 등장한 것으로, 패러미터가 계속해서 바뀌는 쿼리문도 캐쉬를 해둘 수 있도록 하기 위해 고안된 것이다.. 즉, 변화되는 부분을 ? 로 처리해두고 실제 실행될때는 실행될때마다 다른 값이 매칭되어 실행되도록 하는 방식이다.. 솔직히 정말로 빠른지 어떤지는 직접 느껴보지는 못했다..

사용자 삽입 이미지

일반적인 쿼리문 날리는 것과 별반 다를바 없지만, 쿼리문 작성할때 변경되어야 하는 부분을 ?로 표시하여 작성을 하고, 그 부분의 값을 setParam 함수 호출을 통해 값을 할당한다는 부분이 조금 다른 부분이다.. setParam 이라는 함수 내부에서는 psmt.setString(1, 변수값); 과 같이 몇번째 ?를 어떤 값으로 바꿔야 하는지를 명시하는 코드가 들어가 있다..

사실, 그냥 막 쿼리 날리는 것과 이렇게 수정하는 것과의 차이는 거의 없고 어려운 일이 아니기 때문에 여기까지는 좋았다.. 그런데 사용중 쿼리문이 에러가 나는 현상이 발생.. 로그를 찍어서 어떤 쿼리문이 날아가고 있는지 보고 싶은데, 이런 젠장.. PraparedStatement의 쿼리 내용을 찍을 수 있는 방법이 없는거다..

자바에서 기본적으로 제공해주는 방법이 있을 것으로 알았다.. ToString으로 하면 될 줄 알았는데, 너무 순진한 생각이었다.. 결국, 자바에서 기본적으로 제공되는 방법으로 Prepared Statement의 실제 실행된 쿼리문 모습을 알아낼 수는 없다는 것을 알게되었다..

검색을 통해 찾은 사이트에서 방법을 알아낼 수 있었다.. (참조 : PreparedStatement - ? 치환해서 로그찍는 소스, 소스 수정에 필요한 파일 다운로드 : LoggableStatement.java) 이런 기능은 자바가 기본으로 제공해주는 Prepared Statement 클래스에 들어가 있으면 좋겠구만 말이지..

사용자 삽입 이미지


이렇게 수정하고 나면, Prepared Statement로 작성된 쿼리문도 최종 수행된 쿼리문이 어떤 모습으로 날아갔는지 확인해 볼 수 있게된다..
Posted by 미친병아리