達夢數據庫-更新clob字段數據只更新進去一部分數據


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM