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

简介: 由于网络带宽不足导致的jdbc向yashandb插入数据慢

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

问题的风险及影响
影响客户的业务处理效率

问题影响的版本
所有的yashandb版本

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

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

解决方法及规避方式
提高jdbc所在操作系统与yashandb server所在操作系统网络之间的带宽

问题分析和处理过程
要插入数据表的ddl如下:

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插入数据:

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();
    }
}
AI 代码解读

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

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

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

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

目录
打赏
0
0
0
0
98
分享
相关文章
【YashanDB知识库】IMP跨网络导入慢问题
问题现象:290M数据,本地导入2分钟,跨机导入耗时显著增加(最高30分钟)。 原因分析:`imp`逐条SQL通过网络传输至yashanDB执行,交互频繁导致性能下降。 影响版本:客户测试环境22.2.8.3。 解决方法:将导入文件上传至与yashanDB同机后使用`imp`,减少网络延迟。 经验总结:优化`imp`工具,支持直接上传文件至服务器端执行,降低网络依赖。
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
63 22
利用Python获取网络数据的技巧
抓起你的Python魔杖,我们一起进入了网络之海,捕捉那些悠游在网络中的数据鱼,想一想不同的网络资源,是不是都像数不尽的海洋生物,我们要做的,就是像一个优秀的渔民一样,找到他们,把它们捕获,然后用他们制作出种种美味。 **1. 打开魔法之门:请求包** 要抓鱼,首先需要一个鱼网。在Python的世界里,我们就是通过所谓的“请求包”来发送“抓鱼”的请求。requests是Python中常用的发送HTTP请求的库,用它可以方便地与网络上的资源进行交互。所谓的GET,POST,DELETE,还有PUT,这些听起来像偶像歌曲一样的单词,其实就是我们鱼网的不同方式。 简单用法如下: ``` im
53 14
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
63 12
YashanDB JDBC驱动应用示例
本文来自YashanDB官网,主要介绍YashanDB的JDBC驱动安装与基础操作示例。内容涵盖示例环境(JDBC驱动、JDK、JRE版本要求)、安装前准备(JDK/JRE安装与验证)、JDBC驱动安装步骤(目录创建、软件包上传与环境配置)以及Java文件编写(连接数据库代码示例与编译执行方法)。通过本文,开发者可快速上手使用YashanDB的JDBC驱动开发应用。
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
【YashanDB知识库】如何使用jdbc向YashanDB批量插入gis数据
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】Springboot启动找不到崖山jdbc驱动的问题处理
本文来自YashanDB官网,主要解决SpringBoot应用启动时出现“找不到崖山JDBC驱动”的问题,尽管lib目录下已有yashandb-jdbc-1.6.9.jar文件。错误信息显示`java.lang.ClassNotFoundException: com.yashandb.jdbc.Driver`。解决方案为:通过`which java`等命令定位Java安装路径,将驱动jar包复制到JRE的`lib/ext`目录下,最后重启应用即可。
下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等