【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左右:

可以得出结论,耗时基本都花在了网络传输上。
经验总结
客户端代码在yashandb运行的操作系统上执行,可以去除掉网络传输的影响,方便分析问题
【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢的更多相关文章
- 普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚
普通的jdbc事务在插入数据后 下面的代码报错时 数据不会回滚 但是 spring的事务会回滚
- python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
实例1.取得MYSQL版本 复制代码 代码如下: # -*- coding: UTF-8 -*-#安装MYSQL DB for pythonimport MySQLdb as mdbcon = Non ...
- JDBC向oracle插入数据
public static void main(String[] args) throws SQLException { 2 3 4 String driver="oracle.jdbc.d ...
- jdbc、Mybatis插入数据主键回显的实现方法
插入数据的时候,往往需要获取主键值.但是有时候主键是自增长的那么,就不太适用手动添加主键值了,此时需要一种可以回显主键参数的方法, 下面以jdbc.mybatis的实现举例 此时使用的是jdbc的话或 ...
- Java使用JDBC连接数据库逐条插入数据、批量插入数据、以及通过SQL语句批量导入数据的效率对比
测试用的示例java代码: package com.zifeiy.test.normal; import java.io.File; import java.io.FileOutputStream; ...
- JDBC 获取被插入数据的主键ID值
除了用存储过程还有以下方法可以获取: static int create() throws SQLException { Connection conn = null; Pre ...
- jdbc预编译插入数据操作
package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepare ...
- jdbc链接mysql插入数据后显示问号
1.在cmd中进入mysql查看默认的编码格式:mysql> show variables like "%char%"; 若不是utf8(因为我用的是utf8),关掉mysq ...
- MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...
随机推荐
- Centos7安装MySQL详细步骤(配置开机自启)
MySQL 检查系统是否安装过mysql //检查系统中有无安装过mysql rpm -qa|grep mysql //查询所有mysql 对应的文件夹,全部删除 whereis mysql find ...
- Linux 更新网络时间
下载包 yum install -y ntpdate 同步网络时间 ntpdate 0.asia.pool.ntp.org 若上面的时间服务器不可用,也可以改用如下服务器进行同步: time.nist ...
- Java 数据类型的包装数据类型
什么是包装数据类型 Java是一个面向对象的编程语言,但基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型. 集合框架里面需要存储对象,不能存储基本数据类型,所以需要存储包装 ...
- 把nodejs程序打包成可执行文件
在写好之后的nodejs程序,想发给同事的电脑上运行程序,就不得不下载node环境,还要安装第三方依赖包,非常的麻烦. 因此,可以借助一些插件来完成nodejs程序的打包,变成可以执行的文件. 将No ...
- 基于EF Core存储的Serilog持久化服务
前言 Serilog是 .NET 上的一个原生结构化高性能日志库,这个库能实现一些比内置库更高度的定制.日志持久化是其中一个非常重要的功能,生产环境通常很难挂接调试器或者某些bug的触发条件很奇怪.为 ...
- 全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“
全网最适合入门的面向对象编程教程:17 类和对象的 Python 实现-鸭子类型与"file-like object" 摘要: 本文主要介绍了 Python 中创建自定义类时鸭子类 ...
- 一种优秀的虚拟机内存架构 - AQ
源链接:https://www.axa6.com/zh/an-excellent-virtual-machine-memory-architecture 简介 虚拟机内存架构直接影响虚拟机的性能和占用 ...
- Django model层之执行原始SQL查询
Django model层之执行原始SQL查询 by:授客 QQ:1033553122 测试环境 Win7 Django 1.11 执行原始SQL查询 Manager.raw(raw_query, ...
- 题解:P10537 [APIO2024] 九月
题解:P10537 [APIO2024] 九月 题意 在一个树上,在 \(k\) 天内有 \(n-1\) 个节点掉落,会有 \(m\) 个记录者记录掉落的情况,每一天每一个人会以任意的顺序记录当天的掉 ...
- STL 算法 <algorithm>,
STL 算法部分主要由头文件 <algorithm>,<numeric>,<functional > 组成.要使用 STL 中的算法函数必须包含头文件 < a ...