記一次執行達夢數據庫更新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即可解決該問題;具體原因沒有深挖了;
