记一次执行达梦数据库更新clob字段遇到的坑;
clob字段主要用于存储大文本的字符的字段类型,所以项目把前端的json数据直接存进去了;
问题经历:
测试环境:发现了一个前端报错,排查发现前端取到的json数据被截断了;只有部分数据。后端排查发现字段存储确实只有一部分数据;
debug发现:后端执行sql的时候,读取的文件时50058Byte,代码执行时字符长度也是50058;但是update后数据库字段只有32767Byte数据;
同样的代码执行oracle却是正确的;这就很奇怪的现象;
//更新数据
public static void saveinfo(InputStream in, int length, String tablename,
String pkname, String pkvalue, String columname) throws ParseException {
Connection conn = null;
PreparedStatement pstmt = null;
byte[] datas = new byte[length];
System.out.println("更新表名是:"+tablename);
System.out.println("更新表主键字段:"+pkname);
System.out.println("更新表主键值为:"+pkvalue);
System.out.println("更新表clob字段为:"+pkvalue);
String dataStr =null;
try {
in.read(datas);
dataStr = new String(datas,"GBK");
} catch (IOException e) {
e.printStackTrace();
}
StringReader dataReader = new StringReader(dataStr);
try {
conn= JDBCtest.getConn();
String sql = "update " + tablename + " set " + columname
+ "= ?, ts = null where " + pkname + " = '" + pkvalue + "'";
pstmt = JDBCtest.getPStmt(conn, sql);
System.out.println("更新的clob字段长度为"+dataStr.length());
pstmt.setCharacterStream(1,dataReader,dataStr.length());
pstmt.executeUpdate();
System.out.println("执行更新的sql为:"+sql);
System.out.println("=========================");
conn.commit();
}
catch (Exception e) {
e.printStackTrace();
}
finally{
JDBCtest.closeStmt(pstmt);
JDBCtest.closeConn(conn);
}
}
后来联系达梦开发一起调试了发现,环境使用了jdk1.8版本,而达梦数据库驱动使用了jdbc17(对应jdk1.7)导致的;更换为对应的jdbc18即可解决该问题;具体原因没有深挖了;