zoukankan      html  css  js  c++  java
  • 达梦数据库-更新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即可解决该问题;具体原因没有深挖了;

  • 相关阅读:
    springCloud学习6(Spring Cloud Sleuth 分布式跟踪)
    springCloud学习5(Spring-Cloud-Stream事件驱动)
    springCloud学习4(Zuul服务路由)
    springCloud学习3(Netflix Hystrix弹性客户端)
    springCloud学习笔记2(服务发现)
    EFCore
    webBrowser.DocumentText重新赋值无效解决方法
    C# SQLite写入和读取DateTime类型
    自定义协议链接 ------2.实践篇
    自定义协议链接 ------1.原理篇
  • 原文地址:https://www.cnblogs.com/liu-ya/p/14767821.html
Copyright © 2011-2022 走看看