问题现象

某客户环境,客户的业务使用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. python rsa-oaep加密示例

    代码: 1 from Crypto.PublicKey import RSA 2 from Crypto.Cipher import PKCS1_OAEP 3 import base64 4 rsa_ ...

  2. matlab常用语法简介

    目录 一.输入函数 1.disp函数 二.合并字符串 1.strcat函数 (1)strcat函数可用于合并字符串,用法如图: 2.利用向量,用法如图: 3.利用"num2str" ...

  3. Eggjs 设置跨域请求 指定地址跨域 nodejs

    首先egg自身框架没有直接设置允许跨域请求的功能和接口,所以需要第三方包来设置跨域请求! 先安装第三方包来设置跨域,使用egg-cors // npm npm i egg-cors --save // ...

  4. c++ primer 第五版随笔

    1.what is std::endl ? for example, std::cout << "hello world" << std::endl; st ...

  5. 解决方案 | 在 Tkinter 中导入 pywinauto/pyautogui 时窗口大小发生变化

    上面问题也可以换一个说法,pywinauto/pyautogui 时改变了tkinter的原有的窗口大小.这个问题困扰了我好几天而且网上有这样的问题但是并没有答案,今天摸索出答案给大家分享下.解决方法 ...

  6. Swift开发基础05-可选项

    可选项定义 可选项,一般也叫可选类型,它允许将值设置为nil 在类型名称后面加个问号? 来定义一个可选项 var name: String? = "Jack" name = nil ...

  7. WSS SSL HTTPS之间的关系

    ssl: secure socket layer 安全套接层,简单来说是一种加密技术,通过它可以在通信的双方上建立一个安全的通信链路,因此数据交互的双方可以安全地通信,而不用担心数据被窃取:wss: ...

  8. MySql创建事件、计划、定时运行

    CREATE EVENT IF NOT EXISTS check_timeout_eventON SCHEDULE EVERY 30 MINUTEDOBEGIN UPDATE safetyApp_in ...

  9. 自己在本地搭建 git 版本仓库服务器

    请确保你安装了 git 的图形化工具和 git 软件 首先先创建一个目录作为你的项目工程目录,比如 e:/gitTest 其次右键 git init. 然后指定一个 git 服务器目录,例如:e:/g ...

  10. java中使用jdbc连接数据库操作

    先贴代码,在做说明 import java.sql.*; import java.util.ArrayList; import java.util.List; public class Conn { ...