前两天频发遇到这个问题,领导开始让截断字符串后插入,但是终究不是解决之道,后来再遇到,必须要解决了。
环境:oracle:11.2.0.3.0。
驱动:ojdbc14_g.jar
目标表字段类型:CLOB
网上搜了一下,基本上有以下几种方法:
1、使用setCharacterStream()方法,代替setString;
2、使用OCI驱动连接Oracle数据库。
3 驱动的问题,换其他版本的驱动。
4 用setClob的方式。
依次尝试:
1 换成setCharacterStream()方法,依然报错。
2 没有考虑这种解决方法,因为OCI驱动要求机器上装有oracle客户端。因为程序肯定要其他机器上运行,就算这种方法能解决,也米有意思。
3 驱动换成ojdbc14-10.2.0.3.0.jar,依然报错,没有继续尝试。
4 解决,具体代码如下,基本上是先插入一个空的CLOB,然后再更新。
public boolean saveCPBaseResultJSON(String json) throwsSQLException {
String sql= "INSERT INTO REPORT_CP_BASE(id,NORM_TIME,JSON) VALUES(SQ_REPORT_CP_BASE.NEXTVAL,sysdate,?)";
PreparedStatement prest=conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
prest.setClob(1, CLOB.empty_lob());
prest.execute();
conn.commit();
prest.close();//获取最大ID
String csql = "select max(id) as max from REPORT_CP_BASE";
Statement stm=conn.createStatement();
ResultSet rs=stm.executeQuery(csql);int max=0;while(rs.next()) {
max=rs.getInt("max");
}try{
UpdateClob(max,json);
}catch(Exception e)
{
e.printStackTrace();return false;
}return true;
}private void UpdateClob(int id,String bigstr) throwsSQLException, IOException {
String sql= "select json from REPORT_CP_BASE where id ="+id+" for update";
Statement stm=conn.createStatement();
conn.setAutoCommit(false);
ResultSet rs=stm.executeQuery(sql);
CLOB clob=null;while(rs.next()) {
clob= (CLOB)rs.getClob(1);
}
Writer writer=clob.getCharacterOutputStream();
writer.write(bigstr);
writer.flush();
writer.close();
conn.commit();
}
View Code