JDBC插入性能优化对比
今天对Insert进行了性能测试,结果反差很大,平时都是单条插入,虽然性能要求没有那么高,但是突然在项目中,人家给定时间内完成,这就尴尬了.
优化数据库,优化服务器,优化代码,反正通过各种优化提高数据的处理速度.
接下来对jdbc插入做一个测试,测试代码入如下:
/**
* 生成插入语句
* @author fgq 2017年12月26日 下午6:40:03
* @return
*/
public static List<String> getInsertSql(){
String sqlModel = "insert into test_cost1(id,name)values('{id}','{name}')";
List<String> insertSqls = new ArrayList<String>();
for(int i=0;i<10000;i++){
sqlModel = sqlModel.replace("{id}", UUIDUtil.getRandomUUID());
sqlModel = sqlModel.replace("{name}", "danny");
insertSqls.add(sqlModel);
}
return insertSqls;
}
/**
* Statement单条插入
* @author fgq 2017年12月26日 下午6:39:05
* @param conn
* @throws Exception
*/
public static void executeSQL(Connection conn) throws Exception {
List<String> insertSql = getInsertSql();
Statement stmt = conn.createStatement();
for(String sql : insertSql){
stmt.execute(sql);
}
} /**
* Statement批量插入
* @author fgq 2017年12月26日 下午6:39:24
* @param conn
* @throws Exception
*/
public static void executeBatchSQL(Connection conn) throws Exception {
List<String> insertSql = getInsertSql();
Statement stmt = conn.createStatement();
for(String sql : insertSql){
stmt.addBatch(sql);
}
stmt.executeBatch();
}
/**
* PreparedStatement批量插入
* @author fgq 2017年12月26日 下午6:40:34
* @param conn
* @throws Exception
*/
public static void batchInsertData(Connection conn) throws Exception{
String prefix = "insert into test_cost1(id,name)values(?,?)";
PreparedStatement pst = conn.prepareStatement(prefix);
for(int j = 0;j<10000;j++){
pst.setString(1, UUIDUtil.getRandomUUID());
pst.setString(2, "liming");
pst.addBatch();
}
pst.executeBatch();
} /**
* PreparedStatement单条插入
* @author fgq 2017年12月26日 下午6:40:16
* @param conn
* @throws Exception
*/
public static void insertData(Connection conn) throws Exception{
String prefix = "insert into test_cost1(id,name)values(?,?)";
PreparedStatement pst = conn.prepareStatement(prefix);
for(int j = 0;j<10000;j++){
pst.setString(1, UUIDUtil.getRandomUUID());
pst.setString(2, "liming");
pst.executeUpdate();
}
}
public static void main(String[] args) throws Exception {
final String url = "jdbc:oracle:thin:@123.123.123.123:1521/orcl";
final String name = "oracle.jdbc.driver.OracleDriver";
final String user = "test";
final String password = "test";
Connection conn = null;
Class.forName(name);//指定连接类型
conn = DriverManager.getConnection(url, user, password);//获取连接
if (conn!=null) {
System.out.println("获取连接成功");
long startTime = System.currentTimeMillis();
insertData(conn);
System.out.println("执行1000插入耗时:"+(System.currentTimeMillis() - startTime));
}else {
System.out.println("获取连接失败");
}
}
通过上面10000条测试结果,发现效率最高的是
batchInsertData
最慢的是
insertData
所以在进行第三方库的插入,最好选择效率最高的,而且在批量执行的时候,最好不要有数据冲突,否则执行失败,所以与业务无关的主键很重要.
JDBC插入性能优化对比的更多相关文章
- 大数据应用之HBase数据插入性能优化实测教程
引言: 大家在使用HBase的过程中,总是面临性能优化的问题,本文从HBase客户端参数设置的角度,研究HBase客户端数据批量插入性能优化的问题.事实胜于雄辩,数据比理论更有说服力,基于此,作者设计 ...
- MySQL插入性能优化
目录 MySQL插入性能优化 代码优化 values 多个 一个事务 插入字段尽量少,尽量用默认值 关闭 unique_checks bulk_insert_buffer_size 配置优化 inno ...
- MySQL批量SQL插入性能优化
对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...
- MySQL插入性能优化(转)
原文:http://tech.uc.cn/?p=634 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时 ...
- 大数据应用之HBase数据插入性能优化之多线程并行插入测试案例
一.引言: 上篇文章提起关于HBase插入性能优化设计到的五个参数,从参数配置的角度给大家提供了一个性能测试环境的实验代码.根据网友的反馈,基于单线程的模式实现的数据插入毕竟有限.通过个人实测,在我的 ...
- laravel 5.1 性能优化对比 - 框架提供的方法
写了一个项目发现性能不如人意. 于是便测试下, 看下性能瓶颈在什么地方. 使用 ab -n 20 http://www.lartest.com/ 软件环境: OS : windows 8.1 CPU: ...
- Flask性能优化对比
基于Flask的网关:Flask,Uwsgi,Gevent,Gunicorn(gevent),Tornado,Twisted !/usr/bin/python -- coding:utf-8 -- 美 ...
- Android Sqlite 批量插入性能优化
db.beginTransaction(); try { for (...) { db.execSQL("...", new Object[]{}); } db.setTransa ...
- 【转】MySQL批量SQL插入各种性能优化
原文:http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=403182899&idx=1&sn=74edf28b0bd29 ...
随机推荐
- StackExchange.Redis性能调优
大家经常出现同步调用Redis超时的问题,但改成异步之后发现错误非常少了,但却可能通过前后记日志之类的发现Redis命令非常慢. PS: 以后代码都在Windows bash中运行,StackExch ...
- 巨蟒python全栈开发-第14天 内置函数2 递归 二分查找
一.今日内容总览 1.内置函数补充 repr() 显示出字符串的官方表示形式 chr() arscii码中的字,转换成位置 ord() arscii码中的位置,转换成字2.递归 自己调用自己 两个口: ...
- CSRF Laravel
Laravel 使得防止应用 遭到跨站请求伪造攻击变得简单. Laravel 自动为每一个被应用管理的有效用户会话生成一个 CSRF “令牌”,该令牌用于验证授权用 户和发起请求者是否是同一个人. 任 ...
- git 添加远程仓库后无法push
push的时候提示fatal: refusing to merge unrelated histories 假如我们的源是origin,分支是master,那么我们 需要这样写git pull o ...
- WSGI基础知识(转)
add by zhj: WSGI全称Web Server Gateway Interface,即Web网关接口.其实它并不是OSI七层协议中的协议,它就是一个接口(即函数)而已,而WSGI规定了该接口 ...
- C++对象模型那点事儿(布局篇)
1 前言 在C++中类的数据成员有两种:static和nonstatic.类的函数成员由三种:static,nonstatic和virtual. 上篇我们尽量说一些宏观上的东西,数据成员与函数成员在类 ...
- python学习之路-第八天-文件IO、储存器模块
文件IO.储存器模块 文件IO 代码示例: # -*- coding:utf-8 -*- #! /usr/bin/python # filename:using_file.py poem = '''\ ...
- python 的两个模块xlwt,xlrd,写入和读取Excel数据
http://www.cnblogs.com/fireme/p/3887284.html 这上面写的很全,不过我只需要简单的读和写的操作就ok了,下面是我写的读和写入Excel操作 读取Excel数据 ...
- BZOJ 5312: 冒险
首先我们考虑,对于And 和 Or 操作,对于操作位上只有And 0 和 Or 1 是有效果的. 我们注意到如果区间内需要改动的操作位上的数字都相同,那么是可以区间取与以及区间取或的. 那其实可以维护 ...
- for_each用法
for_each()是个function template #include <algorithm>头文件说明 template<class _InIt, class _Fn1> ...