首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【YashanDB 数据库】由于网络带宽不足导致的 jdbc 向 yashandb 插入数据慢

【YashanDB 数据库】由于网络带宽不足导致的 jdbc 向 yashandb 插入数据慢

作者头像
用户10349277
发布2025-02-21 11:42:14
发布2025-02-21 11:42:14
14100
代码可运行
举报
运行总次数:0
代码可运行

问题现象

某客户环境,客户的业务使用 jdbc 驱动向其他操作系统上的 yashandb 插入 90 万条数据,耗时大约 30 分钟。

问题的风险及影响

影响客户的业务处理效率

问题影响的版本

所有的 yashandb 版本

问题发生原因

jdbc 执行 batch insert 时,是有绑定变量的。在准备好了 PreparedStatement 以后,jdbc 驱动要向 yashandb server 发送绑定变量的值。

由于网络带宽不足,这些绑定变量的值发送需要耗费一定时间,最终导致了插入数据效率降低。

解决方法及规避方式

提高 jdbc 所在操作系统与 yashandb server 所在操作系统网络之间的带宽

问题分析和处理过程

要插入数据表的 ddl 如下:

代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE "LOCATION_INFO_INDEX000001"
(
"ID" VARCHAR(36) NOT NULL,
"VEHICLENO" VARCHAR(11) NOT NULL,
"VEHICLECOLOR" NUMBER(1,0) NOT NULL,
"MILEAGE" NUMBER(11,0) NOT NULL,
"LONGITUDE" NUMBER(16,6) NOT NULL,
"LATITUDE" NUMBER(16,6) NOT NULL,
"HEIGHT" NUMBER(11,0) NOT NULL,
"SPEED" NUMBER(11,0) NOT NULL,
"DIRECTION" NUMBER(11,0) NOT NULL,
"DATETIME" NUMBER(16,0) NOT NULL,
"DATE" VARCHAR(10) NOT NULL,
"ALARM" NUMBER(11,0) NOT NULL,
"STATE" NUMBER(11,0),
"MSGGNSSCENTERID" VARCHAR(255),
"MSGGNSSCENTERNAME" VARCHAR(255),
"INS" NUMBER,
"SEQ" NUMBER,
"UPDATESTATUS" NUMBER,
"UPDATETIME" VARCHAR2(50),
CONSTRAINT "LOCATION_INFO_INDEX000001_PKEY" PRIMARY KEY("ID")) ;

使用如下的 java 代码作为 jdbc 客户端向 yashandb server 插入数据:

代码语言:javascript
代码运行次数:0
运行
复制
public void test_slow_table(Connection conn){
        try{
            //System.out.println(DBUtil.buildInsertMeta(conn, "SZSJYJTGK", "LOCATION_INFO_INDEX000001"));
            conn.setAutoCommit(false);
            PreparedStatement ps = conn.prepareStatement("insert into LOCATION_INFO_INDEX000001(ID ,VEHICLENO ,VEHICLECOLOR ,MILEAGE ," +
                    "LONGITUDE ,LATITUDE ,HEIGHT ,SPEED ,DIRECTION ,\"DATETIME\" ,\"DATE\" ,ALARM ,\"STATE\" ,MSGGNSSCENTERID ,MSGGNSSCENTERNAME ,INS ,SEQ ,UPDATESTATUS ," +
                    "add_time,UPDATETIME,by01,by02) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
 
            System.out.println("1: " + Instant.now());
            long start = System.currentTimeMillis();
            int base = 100900000;
            for(int i = base;i < base+100000; i++) {
                //ID                                                               NOT NULL  VARCHAR(144)
                //System.out.println("add id_" + i);
                ps.setString(1, "id_" + i);
                //VEHICLENO                                                        NOT NULL  VARCHAR(44)
                ps.setString(2, "abcd");
                //VEHICLECOLOR                                                     NOT NULL  NUMBER(1)
                ps.setInt(3,1);
                //MILEAGE                                                          NOT NULL  NUMBER(11)
                ps.setInt(4, i);
                //LONGITUDE                                                        NOT NULL  NUMBER(16,6)
                ps.setInt(5, i);
                //LATITUDE                                                         NOT NULL  NUMBER(16,6)
                ps.setInt(6,i);
                //HEIGHT                                                           NOT NULL  NUMBER(11)
                ps.setInt(7,i);
                //SPEED                                                            NOT NULL  NUMBER(11)
                ps.setInt(8,i);
                //DIRECTION                                                        NOT NULL  NUMBER(11)
                ps.setInt(9,i);
                //DATETIME                                                         NOT NULL  NUMBER(16)
                ps.setInt(10,i);
                //DATE                                                             NOT NULL  VARCHAR(40)
                ps.setString(11, "abcd");
                //ALARM                                                            NOT NULL  NUMBER(11)
                ps.setInt(12,i);
                //STATE                                                                      NUMBER(11)
                ps.setInt(13,i);
                //MSGGNSSCENTERID                                                            VARCHAR(1020)
                ps.setString(14,StringUtil.buildString(256));
                //MSGGNSSCENTERNAME                                                          VARCHAR(1020)
                ps.setString(15,StringUtil.buildString(256));
                //INS                                                                        NUMBER
                ps.setInt(16,i);
                //SEQ                                                                        NUMBER
                ps.setInt(17,i);
                //UPDATESTATUS                                                               NUMBER
                ps.setInt(18,i);
                //ADD_TIME                                                                   TIMESTAMP
                ps.setTimestamp(19,new Timestamp(System.currentTimeMillis()));
                //UPDATETIME                                                                 TIMESTAMP
                ps.setTimestamp(20,new Timestamp(System.currentTimeMillis()));
                ps.setString(21,StringUtil.buildString(256));
                ps.setString(22,StringUtil.buildString(256));
 
 
                ps.addBatch();
                if((i+1)%1000 == 0){
                    System.out.println("21:" + Instant.now());
                    ps.executeBatch();
                    conn.commit();
                }
            }
            System.out.println("2:" + Instant.now());
            ps.executeBatch();
            System.out.println("3:" + Instant.now());
            conn.commit();
            System.out.println("4:" + Instant.now());
            long end = System.currentTimeMillis();
            System.out.println("cost:" + (end-start) + " ms");
 
        }catch (Exception e){
            e.printStackTrace();
        }
    }

jdbc 客户端和 yashandb server 不在一个操作系统时,其网络带宽大概为 800KB/s

插入 10 万条数据,大概耗时 130s:

同样的 jdbc 代码在运行 yashandb 的操作系统上执行,耗时 4s 左右:

可以得出结论,耗时基本都花在了网络传输上。

经验总结

客户端代码在 yashandb 运行的操作系统上执行,可以去除掉网络传输的影响,方便分析问题

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题现象
  • 问题的风险及影响
  • 问题影响的版本
  • 问题发生原因
  • 解决方法及规避方式
  • 问题分析和处理过程
  • 经验总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档