잘돌아가던 프로그램이 갑자기 희한한 로그를 찍더군요...
뭐지???
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 |