【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应用程序的性能介绍一些基本的指导原则,这其中的 ...
随机推荐
- debian12 创建本地harbor镜像库
前言 harbor是一个docker/podman镜像管理库,可用于存储私人镜像.现将本人在debian12系统搭建harbor镜像库的过程记录下来,留作后续参考. 可以参考github harbor ...
- 在ubuntu16.04下,源码编译安装特定版本的MongoDB PHP扩展
背景:我的php项目在连接其他mongo库时报:Server at xxx:27017 reports wire version 5, but this version of libmongoc re ...
- oeasy教您玩转vim - 20 - 显示标尺
显示标尺 回忆上节课内容 定义标记 a ma 删除标记 a :delm a 跳转到标记 a 'a `a 跳到 a 对应的行和列 'a 跳到 a 对应的行 查看所有标记 :marks 各种标记类型 '' ...
- Microsoft Azure AI 机器学习笔记-1
机器学习基础: 数据与建模: 数据统计和数学建模是处理数据和描述现实情况的关键工具. 观测值是记录的数据实例,而特征是描述观测对象的属性. 标签则代表监督式学习中的已知输出值. 学习类型: 监督式学习 ...
- TIER 0: Dancing
TIER 0: Dancing SMB Server Message Block 是一种网络协议,用于在计算机网络上共享文件.打印机和其他资源.它最初由微软开发,用于在 Windows 操作系统之间进 ...
- 网络基础 CAS协议学习总结
架构介绍 系统组件 CAS服务器和客户端构成了CAS系统体系结构的两个物理组件,它们通过各种协议进行通信. CAS服务器 CAS服务器是基于Spring Framework构建的Java servle ...
- CF1988C Increasing Sequence with Fixed OR Solution
题意简述如下: 给定一个正整数 \(n\),请构造一个正整数序列使其满足以下条件并尽可能长:这个序列中每个数都大于等于 \(1\) 且小于等于\(n\):这个序列是单调递增的:这个序列中任意两个相邻的 ...
- docker 6.1测试
https://www.cnblogs.com/xiugeng/p/10193333.html#_label1 1.设置重启策略 [root@docker ~]# cat /etc/docker/da ...
- Jmeter函数助手25-log
log函数用于记录一条日志并返回其值. String to be logged (and returned):函数会返回该值.控制台也能看到该字符 Log level (default INFO) o ...
- 【Java】Mysql文档生成工具
资料参考: https://blog.csdn.net/weixin_43797561/article/details/122809269 https://blog.csdn.net/qq_33177 ...