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

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

时间:2024-08-08 16:08:16浏览次数:6  
标签:11 ps System jdbc YashanDB NUMBER setInt 网络带宽 NULL

问题现象

某客户环境,客户的业务使用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左右:

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

经验总结

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

标签:11,ps,System,jdbc,YashanDB,NUMBER,setInt,网络带宽,NULL
From: https://www.cnblogs.com/YashanDB/p/18349116

相关文章

  • 如何在python中使用jdbc jar文件连接informix数据库
    有什么想法如何使用jdbcjar文件连接到informix数据库吗?在python我尝试了jaydebeapi,当我执行时:conn=jaydebeapi.connect('com.informix.jdbc.IfxDriver',myurl,['user','pass'],jdbc_driver_path)...然后从表中选择数据的其余代码当我执行myscript.py它只......
  • 如何把Connection 封装到工具类里面 调用工具类方法实现 增删改查操作 java JDBC
    如何把Connection封装到工具类里面调用工具类方法实现增删改查操作javaJDBC使用数据库连接池以HikariCP为例在JDBC中,使用数据库连接池是一个常见的做法,以提高数据库操作的效率和性能。连接池管理着一组数据库连接,这些连接可以被重用而不是每次需要时都创建新的连接。......
  • 如何把Connection 封装到工具类里面 调用工具类方法实现 增删改查操作 java JDBC使用
    如何把Connection封装到工具类里面调用工具类方法实现增删改查操作javaJDBC使用C3P0数据库连接池答:当使用C3P0作为数据库连接池时,你可以按照类似的模式来配置和使用它。以下是一个示例,展示了如何在Java项目中配置C3P0连接池,并创建一个工具类来管理数据库连接和执行基本的......
  • JDBC
    一、JDBC开发步骤1.加载驱动2.获取连接对象3.写sql语句4.创建statement5.执行sql语句6.关闭连接 二、JDBC接口核心的API1.DriverManager类:驱动管理类,用于管理所有注册的驱动程序   registerDriver(driver):注册驱动类对象   ConnectiongetConnection(u......
  • 【YashanDB数据库】数据库运行正常,日志出现大量错误metadata changed
    问题现象客户在麒麟kylinv10sp1环境上部署YashanDB,运行正常,但是在巡检中发现run.log中有大量错误日志文件metadatachanged,需要排查原因问题单:前置机大量错误日志文件metadatachanged,需要排查原因问题的风险及影响客户环境为准生产环境,担心影响业务执行。问题影响的版本......
  • 【YashanDB数据库】VMware虚拟机使用默认安装,在掉电之后数据库无法启动
    问题现象客户使用VMware虚拟机使用默认安装,部署YashanDB个人版,在掉电之后无法启动操作系统:Virtualization:VMwareOperatingSystem:CentOSLinux7(Core)CPEOSName:cpe:/o:centos:centos:7Kernel:Linux3.10.0-1160.el7.x86_64Architecture:x86-64[yashan@localho......
  • 【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo block
    问题现象客户将一个100G的表的数据插入到另一个表中,使用insertintoselect插入数据。从第一天下午2点开始执行,到第二天上午10点,一直未执行完毕。由于需要实施下一步操作,客户kill重启了数据库,之后数据库一直回滚中,导致后续执行其他操作都报错YAS-02016nofreeundoblocks问题......
  • MySQL JDBC连接参数rewriteBatchedStatements(转)
    原文:https://blog.51cto.com/u_16213583/9701812MySQLJdbc驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,直接造成较低的性能。只有把rewriteBatchedStatements参数置为true,驱动才会帮你批量执行。不过,驱动具体是怎......
  • 【YashanDB数据库】statement级别的触发器在jdbc接口调用executeBatch时被多次触发
    问题现象某客户使用jdbc接口向yashandb的表A插入数据。表A上有一个语句级触发器,其内容为在触发时执行altersequence操作;另外还有一个insert时的行级触发器,其内容为将每行的部分列赋给新值,这些新值要么来自sequence.nextval,要么来自于current_timestamp。客户向表A插入90万条数......
  • 【YashanDB数据库】自关联外键插入数据时报错:YAS-02033 foreign key constraint viola
    问题现象使用如下的sql语句创建自关联外键表:droptableself_f_key;createtableself_f_key(t1numberprimarykeynotnull,t2number);createindexi_s_1onself_f_key(t2);altertableself_f_keyaddconstraintc_0001foreignkey(t2)referencesself_f_key(t1);......