【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应用程序的性能介绍一些基本的指导原则,这其中的 ...
随机推荐
- 好消息!数据库管理神器 Navicat 推出免费精简版:Navicat Premium Lite
前言 好消息,前不久Navicat推出了免费精简版的数据库管理工具Navicat Premium Lite,可用于商业和非商业目的,我们再也不需要付费.找破解版或者找其他免费平替工具了,有需要的同学可 ...
- Python潮流周刊的优惠券和精美电子书(EPUB、PDF、Markdown)
Python潮流周刊从 2023.05.13 连载至今,本周即将发布第 60 期,这意味着我们又要达成一个小小的里程碑啦! 每周坚持做分享,周复一周,这对自己的精力和意志是一项不小的挑战.于是,为了让 ...
- C#-WPF初学
1.新建一个WPF的应用: 2.拖拽控件并布局好: [小技巧]选中控件,点击"回形针"即可让该控件跟随窗口自动调整大小: 3.编写代码: 主程序代码如下: namespace Wp ...
- oeasy教您玩转vim - 80 - # 宏macro
宏 macro 回忆 这次我们了解了编码格式 屏幕显示的encoding 文件保存的fileencoding 不能搞乱了 一般用什么编的就用什么解 解铃还须系铃人 打开不正确的话,就要切到正确的上 ...
- JavaScript小技巧~将伪数组转成数组的方法
伪数组:具有数组结构但是五数组相关方法的类数组结构: 方式1:Array.from() 方式2:Array.prototype.slice.call(); 用方式1吧,好记简单
- keycloak~为微信二维码添加动态kc认可的动态state
本实例将通过keycloak社区登录实现微信二维码的登录,并且二微码不是keycloak动态生成,而是通过微信提供的js生成的,在页面上直接输出的方式实现的. 动态state 在Keycloak中使用 ...
- linux环境弱网测试
linux环境弱网测试 使用以下命令可以对linux系统进行弱网设置 sudo tc qdisc add dev eth0 root netem delay 500ms #设置500ms的 ...
- RPA美团外卖商家中心批量发送消息
美团外卖商家中心批量发送消息,首先我们需要确定给谁发,发送什么内容 给谁发:可以传入美团用户名.美团订单号.美团将通过此条件进行搜索进入会话框 发送什么内容:批量发送信息给不同的用户,比如给不同的订单 ...
- 【Scala】02 循环
1.支持集合直接作为循环体的条件: // - - - - 支持集合遍历 - - - - var arr = Array(10, 20, 30) var arr2 = List(10, 20, 30) ...
- NVIDIA显卡如何进一步压榨性能 —— 开启单用户独享模式
开启单用户独享模式可以提高显卡利用率,但是最大的缺点就是开启后显卡中只能有一个用户的程序,其他用户的程序只能等待显卡中原有程序全部退出才可以使用显卡,因此该种模式只适合于个人电脑,不适合于服务器(没有 ...