问题现象

某客户环境,客户的业务使用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运行的操作系统上执行,可以去除掉网络传输的影响,方便分析问题

【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢的更多相关文章

  1. 普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚

    普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚

  2. python数据库操作常用功能使用详解(创建表/插入数据/获取数据)

    实例1.取得MYSQL版本 复制代码 代码如下: # -*- coding: UTF-8 -*-#安装MYSQL DB for pythonimport MySQLdb as mdbcon = Non ...

  3. JDBC向oracle插入数据

    public static void main(String[] args) throws SQLException { 2 3 4 String driver="oracle.jdbc.d ...

  4. jdbc、Mybatis插入数据主键回显的实现方法

    插入数据的时候,往往需要获取主键值.但是有时候主键是自增长的那么,就不太适用手动添加主键值了,此时需要一种可以回显主键参数的方法, 下面以jdbc.mybatis的实现举例 此时使用的是jdbc的话或 ...

  5. Java使用JDBC连接数据库逐条插入数据、批量插入数据、以及通过SQL语句批量导入数据的效率对比

    测试用的示例java代码: package com.zifeiy.test.normal; import java.io.File; import java.io.FileOutputStream; ...

  6. JDBC 获取被插入数据的主键ID值

    除了用存储过程还有以下方法可以获取:     static int create() throws SQLException {     Connection conn = null;     Pre ...

  7. jdbc预编译插入数据操作

    package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepare ...

  8. jdbc链接mysql插入数据后显示问号

    1.在cmd中进入mysql查看默认的编码格式:mysql> show variables like "%char%"; 若不是utf8(因为我用的是utf8),关掉mysq ...

  9. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  10. 1   开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。   本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括:    正确的使用数据库MetaData方法    只获取需要的数据    选用最佳性能的功能    管理连

    1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...

随机推荐

  1. joigsc2022_e 题解

    翻译 有长度为 \(n\) 的序列 \(a\) 和 \(L\),你需要对于每个 \(x \in[1,n]\) 求出若把第 \(x\) 个数到第 \(n\) 个数依次装入容量为 \(L\) 的箱子中(每 ...

  2. centos下安装Docker容器

    安装前的准备工作 1.列出docker安装过的相关包 sudo yum list installed | grep docker 2.删除相关安装包 #根据查找出来的进行删除,不同版本可能有不一样的情 ...

  3. [oeasy]python0051_ 转义_escape_字符_character_单引号_双引号_反引号_ 退格键

    转义字符 回忆上次内容 上次研究的是进制转化 10进制可以转化为其他形式 bin oct hex 其他进制也可以转化为10进制 int 可以设置base来决定转为多少进制 回忆一下 我们为什么会有八进 ...

  4. [oeasy]python0007-调试程序_debug

    ​ 调试程序 回忆上次内容 ​py​​ 的程序是按照顺序执行的 是一行行挨排解释执行的 程序并不是数量越多越好 kpi也在不断演化 ​ 编辑 写的代码越多 出现的bug就越多 什么是bug 如何找bu ...

  5. JavaScript小面试~href和src的区别

    href:中文名称叫超文本引用 src:中文叫资源 先要知道它们两个的区别,我们首先要看哪些元素在使用这些属性. href:a,link src:img,style,input,script,ifra ...

  6. Python 基于pymongo操作Mongodb学习总结

    实践环境 Python 3.6.4 pymongo 4.1.1 pymongo-3.12.3-cp36-cp36m-win_amd64.whl 下载地址:https://pypi.org/simple ...

  7. 为什么我@Value中明明显示了值,他却是null

    今天尝试把一些重要东西写入application.yml里,结果在使用的时候发现value取不出来值原因有2个: 1.没有写@compent,没有把这个类交给spring管理 2.在service层n ...

  8. 如何在本地修改Hosts文件设置域名访问?

    网站在未上线的时候,我们一般会在本地搭建Web环境并安装WordPress来设计页面.测试插件.数据备份.网站搬家. 为了能够在本地通过域名访问网站,就需要在修改hosts文件来绑定域名,方法如下: ...

  9. 【Centos】RPM安装Mysql8

    先去官网下载RPM包,没想到RPM包是红帽发行版 https://dev.mysql.com/downloads/mysql/ 使用wget直接下载到Centos里面: wget https://cd ...

  10. 【Android】看安卓代码的一点笔记

    最近项目需要把安卓项目拉下来看了 简单来说的话,网页是HTML + CSS + JS 组成的,运行环境是浏览器上面 安卓APP应用是 Java + XML 组成的,运行环境是这个安卓系统中 构成结构 ...