SQLCODE: -301 오류

DB2 | 2006. 5. 8. 19:16
Posted by 시반

개괄 

 Oracle환경에 개발된 소스를 DB2로 옮긴 후 런타임시 PreparedStatement의 setString(int,String)이 사용된곳에서 SQLCODE: -301 에러가 난다

 증상

com.ibm.db2.jcc.c.SqlException: DB2 SQL error: SQLCODE: -301, SQLSTATE: 07006,SQLERRMC: 1

 환경

Websphere5.0, DB2 8.0, JDK1.4, Struts1.1
DB접속환경
data source : org.apache.commons.dbcp.BasicDataSource
driver : com.ibm.db2.jcc.DB2Driver
jdbc type : type4

원인 

PreparedStatement구문의 setXXX()와 database쪽의 데이타타입의 불일치

테이블의 컬럼의 데이타타입이  decimal 인 곳에 해당하는 파라미터의 값지정시  setString으로 세팅시 에러발생 즉, varchar타입이 아닌곳은 모두 에러 발생.

조치

Database쪽의 데이타 타입과 일치시킴.(오라클은 데이타타입과 무관하게 setString으로 가능..)

여기서, 문제는 java소스내의 preparedstatement의 파라미터 셋팅에 관계되는 모든 변수가 String이기에
setXXX(int,String) 이여만한다.
쿼리문의 파라미터 셋팅하는 곳이 소스내에 5000여곳이 넘게 존재하므로 각각에 올바른 데이터타입으로 셋팅하게 수정하는것은 불가능.


[1차 해법]
setString(int,String)을 모두 setObject(int,Object)로 변경했음(317개화일의 5000곳이상에 존재하는 setString을...ㅠㅠ)
자동케스팅이 되므로 성공. (하지만 좀더 좋은 방법을 찾아봄 - 순노가다이므로ㅡㅡ;)

[2차 해법]
Datasource를 DB2의 것(com.ibm.db2.jcc.DB2DataSource)으로 변경하여 수정
DB2DataSource.setDeferPrepares(false); // 기본값은 true
로 설정하면 setString(int,String)으로도 DB상의 타입에 맞게 자동케스팅이 일어남.
그러나, true의 경우보다 성능은 떨어진다고 함.(DB2 인포메이션센타에서)
테스트 성공 (1차의 경우보다 덜 노가다. 하지만 더 좋은 방법 모색 ㅡㅡ;; )

[3차 해법-최종안]
처음의 Source를 그대로 유지
datasource : org.apache.commons.dbcp.BasicDataSource
preparedstatement의 파라미터 셋팅도 setString(int,String) 그대로 둠.
변경사항 : JDBC접속 url에 파라미터 첨가.
jdbc:db2://host:portNumber/DBname  -> jdbc:db2://host:portNumber/DBname:deferPrepares=false;
(여기서 세미콜론도 꼭 있어야됩니다.)

다른 소스의 변경없이
테스트 성공. ㅡㅡ;;;;;;; (초간단)

'DB2' 카테고리의 다른 글

DB2에서의 부분범위 처리  (0) 2006.06.01
SQL0418N 오류  (0) 2006.05.09
SQL30081N 오류  (0) 2006.05.02
DBMS별 날짜 포맷변환  (0) 2006.04.13
DB2 migration 중 발생한 에러  (0) 2006.04.06
 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)