잘돌아가던 프로그램이 갑자기 희한한 로그를 찍더군요...

뭐지???

java.sql.SQLException: Data size bigger than max size for this type: 3042
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
        at oracle.jdbc.ttc7.TTCItem.setArrayData(TTCItem.java:147)
        at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindItem(DBDataSetImpl.java:2460)
        at oracle.jdbc.driver.OraclePreparedStatement.setItem(OraclePreparedStatement.java:1190)
        at oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:1610)
        at com.igloosec.spiderx.setup.schema.DBSchema.setXMLTable(Unknown Source)
        at com.igloosec.spiderx.setup.schema.GmwDBDownload.run(Unknown Source)


이게 뭐야??

한참을 찾아본결과...

preparedstatement 로는 2000byte 초과되는 데이터에 관해서는 insert가 안된다고 하더군요.

그럼 statement로는 될까? 테스트 해본결과... 너무 잘되군요 ㅡㅡ;;;;;

뭐야 이거!!!!!

어떻게 해야 이상황을 극복할수 있을까 하고 고민하면서 검색중에

http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=jdbc&c=r_p&n=1152605190

요런데가 보이더군요...

흠... 정말 테스트 열심히 하셨구나... 짝짝... 멋진분이심돠.

이걸 극복하기 위해서는

1 . setCharacterStream 요녀석을 사용
2. oracle.jdbc.ttc7.NonPlsqlTTCDataSet.class의 marshalRow 요놈을 수정.


하라고 하더군요...

그러나 제 경우는 이럴수 없는 상황이었습니다.(그런 상황이 있습니다. 묻지도 따지지도 맙시다 ㅡ,.ㅡ+)

그래서 돌아가는 방법을 선택...

2000바이트가 넘는 데이터는 저장할때 빈공간이 입력되도록 설정해놓고...

해당 데이터를 update로 statement를 사용하는 겁니다.


그러니 간단하게 보여드리면...
id = 뭐.. 숫자 아무거나
name = 아무 이름.
note = 뭐든지 2000byte넘도록
inset into aaa(id,name,note) values(1,'늑대','');

요렇게 들어가도록하고

update aaa set note='2000바이트넘는 그거' where id='1';

요딴식 뭐 그런식으로...

더 좋은 방법이 있으면.. 댓글이라도 ^____________________________^

아.. 혹시 필요하실것 같은 분들이 계실까봐 byte를 확인하는 소스를 잠깐 소개합니다.
String strTest = "";
int cntByte = strTest.getBytes("UTF8").length;

여기서 cntByte 이놈이 DB에 입력되게 될 크기를 나타냅니다.

'Programer > JAVA/C#' 카테고리의 다른 글

java yyyyMMddHHmmss 이상의 date  (0) 2011.12.09
JAVA URL HTTP/HTTPS 통신  (0) 2010.09.30
PocketPC를 이용한 웹서비스  (0) 2010.01.06
JAVA 한글 깨짐  (0) 2010.01.06
JAVA OutofMemory 해결책  (0) 2010.01.06