【JDBC】使用Spring提供的JDBCTemplate通过PrepareStatement向MySql数据库插入千万条数据,耗时32m47s,速度提升有限
数据库环境还和原来一样,只是从Statement换成了PrepareStatement,都说PrepareStatement因为预编译比Statement快,但是实际运行真快不了多少。
代码如下:
package com.hy.action.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;
public class BatchJDBCPstmtInsert {
private static Logger logger = Logger.getLogger(BatchJDBCPstmtInsert.class);
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
//把beans.xml的类加载到容器
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
JdbcTemplate jt=(JdbcTemplate)applicationContext.getBean("jdbcTemplate");
// Initialize conn&pstmt
Connection conn=null;
PreparedStatement pstmt = null;
try {
conn =jt.getDataSource().getConnection();
conn.setAutoCommit(false);
pstmt = conn.prepareStatement("insert into emp(name,age,cdate) values (?,?,?)");
String ctime="2017-11-01 00:00:01";
long clong=getVlaueFrom(ctime);
int index=0;
for(int i=0;i<10000;i++) {
for(int j=0;j<1000;j++) {
index++;
pstmt.setString(1,"'E:"+index+"'");
pstmt.setInt(2, index % 100);
pstmt.setTimestamp(3, new Timestamp(clong));
pstmt.addBatch();
clong+=1000;
}
pstmt.executeBatch();
pstmt.clearBatch();
conn.commit();
logger.info("#"+i+" 1000 records have been inserted to table:'emp'.");
}
} catch (SQLException e) {
logger.error("Error happened:"+e);
try {
conn.rollback();
} catch (SQLException e1) {
logger.error("Can not rollback because of the error:'"+e+"'.");
}
}finally {
try {
pstmt.close();
conn.close();
long endTime = System.currentTimeMillis();
logger.info("Time elapsed:" + toDhmsStyle((endTime - startTime)/1000) + ".");
} catch (SQLException e1) {
logger.error("Can not close connection because of the error:'"+e1+"'.");
}
}
}
private static long getVlaueFrom(String timeStr) {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dt;
try {
dt = sdf.parse(timeStr);
return dt.getTime();
} catch (ParseException e) {
logger.error("Can not parse '"+timeStr+"' to format'yyyy-MM-dd HH:mm:ss'.");
return -1;
}
}
// format seconds to day hour minute seconds style
// Example 5000s will be formatted to 1h23m20s
private static String toDhmsStyle(long allSeconds) {
String DateTimes = null;
long days = allSeconds / (60 * 60 * 24);
long hours = (allSeconds % (60 * 60 * 24)) / (60 * 60);
long minutes = (allSeconds % (60 * 60)) / 60;
long seconds = allSeconds % 60;
if (days > 0) {
DateTimes = days + "d" + hours + "h" + minutes + "m" + seconds + "s";
} else if (hours > 0) {
DateTimes = hours + "h" + minutes + "m" + seconds + "s";
} else if (minutes > 0) {
DateTimes = minutes + "m" + seconds + "s";
} else {
DateTimes = seconds + "s";
}
return DateTimes;
}
}
输出:
INFO [main] - #9990 1000 records have been inserted to table:'emp'. INFO [main] - #9991 1000 records have been inserted to table:'emp'. INFO [main] - #9992 1000 records have been inserted to table:'emp'. INFO [main] - #9993 1000 records have been inserted to table:'emp'. INFO [main] - #9994 1000 records have been inserted to table:'emp'. INFO [main] - #9995 1000 records have been inserted to table:'emp'. INFO [main] - #9996 1000 records have been inserted to table:'emp'. INFO [main] - #9997 1000 records have been inserted to table:'emp'. INFO [main] - #9998 1000 records have been inserted to table:'emp'. INFO [main] - #9999 1000 records have been inserted to table:'emp'. INFO [main] - Time elapsed:32m47s.
数据库的情况:


--END-- 2019年10月13日14:35:50
【JDBC】使用Spring提供的JDBCTemplate通过PrepareStatement向MySql数据库插入千万条数据,耗时32m47s,速度提升有限的更多相关文章
- 【JDBC】使用Spring提供的JDBCTemplate通过Statement向MySql数据库插入千万条数据,耗时4m55s,使用insert语句批量插入方式二
这回依然是使用 insert批量插入这种方式 insert into emp(name,age,cdate) values ('A' , 20, '2019-10-13 00:00:00'), ('B ...
- mysql数据库插入数据获取自增主键的三种方式(jdbc PreparedStatement方式、mybatis useGeneratedKeys方式、mybatis selectKey方式)
通常来说对于mysql数据库插入数据获取主键的方法是采用selectKey的方式,特别是当你持久层使用mybatis框架的时候. 本文除此之外介绍其它两种获取主键的方式. 为了方便描述我们先建一张my ...
- 【JDBC】Mysql海量数据插入——PreparedStatement加快数据插入
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5861959.html 使用JDBC连接数据库时,如果插入的数据量大,一条一条地插入数据会变得非常缓慢.此时,我 ...
- 使用JDBC向数据库中插入一条数据
原谅我是初学者,这个方法写的很烂,以后不会改进,谢谢 /** * 通过JDBC向数据库中插入一条数据 1.Statement 用于执行SQL语句的对象 1.1 通过Connection 的 * cre ...
- Spring Boot入门(2)使用MySQL数据库
介绍 本文将介绍如何在Spring项目中连接.处理MySQL数据库. 该项目使用Spring Data JPA和Hibernate来连接.处理MySQL数据库,当然,这仅仅是其中一种方式,你也 ...
- JDBC快速入门(附Java通过jar包连接MySQL数据库)
•通过jar包连接mysql数据库 •下载jar包 Java 连接 MySQL 需要驱动包,官网下载地址为MySQL驱动包官网下载,选择适合的jar包版本进行安装 (记得安装的地址,下面导入包时会用到 ...
- spring mvc 插入一条数据 返回该数据的主键编号
import org.springframework.jdbc.core.PreparedStatementCreator; import org.springframework.jdbc.suppo ...
- spring boot使用log4j2将日志写入mysql数据库
log4j2官方例子在spring boot中报错而且还是用的是org.apache.commons.dbcp包 我给改了一下使用org.apache.commons.dbcp2包 1.log4j2. ...
- 使用JDBC向数据库中插入一条数据(第一次修改版)
增加了一个Tools类,放了一些常用的工具 package com.JDBC.java; import java.io.IOException; import java.io.InputStream; ...
随机推荐
- hbulider 快捷键
跳转到行 Ctrl + G 页首 Ctrl + Home 页尾 Ctrl + End 下一个选项卡 Ctrl + Tab 上一个 ...
- 19.SSM整合_配置式开发
1.定义实体类Student 2.定义Student表 3.定义index页面 4.定义处理器 5.定义Service 6.定义Dao接口 7.定义Dao的Mapper配置文件 8.定义MyBatis ...
- XXX_initcall()函数分析
1. 先看这些宏的定义(定义在文件include/linux/init.h中) #define pure_initcall(fn) __define_initcall("0",fn ...
- web开发:javascript操作
一.函数闭包 二.面向对象 三.js选择器 四.事件初始 五.js处理页面内容 六.js事件控制标题栏 七.js控制类名 一.函数闭包 ```js// 函数的嵌套定义, 定义在内部的函数就称之为 闭包 ...
- 05_ Flume多级Agent之间串联案例
多级agent之间串联: 从tail命令获取数据发送到avro端口,另一个节点可配置一个avro源来获取数据,发送外部存储 启动两个Agent节点: 使用scp命令拷贝flume安装包到另一台虚拟机; ...
- Keras---Virtualenv 下安装Keras (基于Tensorflow后端)
Python---Virtualenv 下安装Keras (基于Tensorflow后端) 一.Keras简介 https://keras-cn.readthedocs.io/en/latest ...
- 02 js原型链
1 js原型链是一个绕不开的话题.直接上说吧. /** * 1. js里的原型链是怎么样的? 带class 和不带class的原型链的不同. */ const util = require('util ...
- Java Listener
六. Java Listener 1. Java Listener 简介 * Java Listener 1. Java Listener(即:Java 监听器):用于监听 ServletRequ ...
- okhttp连接池:put,get方法&connection回收
OkHttp连接池put和get方法: 在上一次[https://www.cnblogs.com/webor2006/p/9281429.html]咱们分析了连接拦截器,如下: 不管是Http1.0还 ...
- Java&Selenium自动化测试实现页面元素、页面对象及测试代码分离
一.摘要 本篇博文将介绍自动化测试实现页面元素.页面对象及测试代码分离在自动化框架中的实现 二.解析页面元素定位信息 首先,将页面元素与实际的代码分离,首先我们将页面元素定位信息和定位表达式保存在属性 ...