GBase 8a
其他
问答

JDBC 使用批量插入的方式操作longtext、longblob类型的字段,插入的数据超过32K,字段值就会变成dat文件名,而单条操作字段值则正常,驱动包:gbase-connector-java-9.5.0.1-build1-bin.jar

发表于2026-07-02 20:45:0841次浏览4个评论

驱动包:gbase-connector-java-9.5.0.1-build1-bin.jar

数据库版本:9.5.3.28.12509af27

 

使用批量提交,插入之后LONGTEXT、LONGBLOB字段值会变成T--1-1782994247-167481407-140437503252224.dat、T--1-1782994247-168814956-140437503252224.dat
    public static void insert() {

        String url = "jdbc:gbase://IP:5258/sysdb?autoReconnect=true&zeroDateTimeBehavior=round&transformedBitIsBoolean=true";
        try {
            Connection con = DriverManager.getConnection(url, "root", "123456");
            PreparedStatement psmt = null;

            String sql = "INSERT INTO test1 (id, name1, name2) VALUES (1, ?, ?)";
            psmt = con.prepareStatement(sql);
            con.setAutoCommit(false);


            StringBuilder stringBuilder64 = new StringBuilder();
            for (int i = 0; i < 65536; i++) {
                stringBuilder64.append("A");
            }

            for (int i = 1; i <= 1; i++) {

                if(i==1){
                    psmt.setString(1, stringBuilder64.toString());
                    psmt.setBytes(2, stringBuilder64.toString().getBytes());
                }
                psmt.addBatch();
            }
            psmt.executeBatch();
            con.commit();
            psmt.clearBatch();
            con.setAutoCommit(true);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

如果不使用批量插入,LONGTEXT、LONGBLOB字段值就是正常的:AAAAAA……


StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 65536; i++) {
    stringBuilder.append("A");
}
String sourceUrl = "jdbc:gbase://IP:5258/sysdb?autoReconnect=true&zeroDateTimeBehavior=round&transformedBitIsBoolean=true";

String sourceUser = "root";
String sourcePassword = "123456";

Connection sourceConn = null;
Connection targetConn = null;
PreparedStatement sourceStmt = null;
PreparedStatement targetStmt = null;
ResultSet rs = null;


try {
    // 连接源数据库
    sourceConn = DriverManager.getConnection(sourceUrl, sourceUser, sourcePassword);
    sourceStmt = sourceConn.prepareStatement("INSERT INTO test1 (id, name1, name2) VALUES (2, ?, ?)");
    sourceStmt.setString(1, stringBuilder.toString());

    sourceStmt.setBytes(2, stringBuilder.toString().getBytes());
    sourceStmt.execute();


    System.out.println("Data transferred successfully.");
} catch (SQLException e) {
    e.printStackTrace();
} finally {

}

为什么会出现这种情况?

评论

登录后才可以发表评论
pikaysw发表于 1个月前
使用相同的java代码未能复现该现象。建议排查下是不是程序上的问题。
Ryan发表于 1个月前
@pikaysw:还没有集成到程序上,就单纯的跑以上两段代码;
请问一下,您用的驱动jar包和数据库版本都跟我的一致吗?
或者数据库服务器需要配置什么参数,才没有32k的这个限制?
pikaysw发表于 1个月前
@Ryan:_gbase_blob_inner_store_threshold
尝试调整这个参数的值试试。
Ryan发表于 29天前
@pikaysw:我解决问题了,修改配置文件:/opt/gbase/{ip}/gnode/config/gbase_8a_gbase.cnf
以下参数默认是注释的,我删除注释后,重启数据库后解决问题:
gbase_heap_data=512M
gbase_heap_temp=256M
gbase_heap_large=256M
gbase_buffer_insert=256M
gbase_buffer_hgrby=10M
gbase_buffer_distgrby=10M
gbase_buffer_hj=10M
gbase_buffer_sj=10M
gbase_buffer_sort=10M
gbase_buffer_rowset=10M
gbase_buffer_result=10M
最佳回答