【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();
    }
}

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

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

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

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

相关文章
|
8月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
6月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
7月前
|
存储 数据管理 数据库
数据字典是什么?和数据库、数据仓库有什么关系?
在数据处理中,你是否常困惑于字段含义、指标计算或数据来源?数据字典正是解答这些问题的关键工具,它清晰定义数据的名称、类型、来源、计算方式等,服务于开发者、分析师和数据管理者。本文详解数据字典的定义、组成及其与数据库、数据仓库的关系,助你夯实数据基础。
数据字典是什么?和数据库、数据仓库有什么关系?
|
6月前
|
人工智能 Java 关系型数据库
使用数据连接池进行数据库操作
使用数据连接池进行数据库操作
184 11
|
7月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
673 0
|
9月前
|
存储 SQL Java
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。
|
6月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
469 158
|
6月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
6月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1116 152

热门文章

最新文章