用Java向数据库中插入大量数据时的优化
使用jdbc向数据库插入100000条记录,分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试:
- public void exec(Connection conn){
- try {
- //开始时间
- Long beginTime = System.currentTimeMillis();
- //设置手动提交
- conn.setAutoCommit(false);
- Statement st = conn.createStatement();
- for(int i=0;i<100000;i++){
- String sql="insert into t1(id) values ("+i+")";
- st.executeUpdate(sql);
- }
- //结束时间
- Long endTime = System.currentTimeMillis();
- System.out.println("st:"+(endTime-beginTime)/1000+"秒");//计算时间
- st.close();
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
//2.使用PreparedStatement对象
- public void exec2(Connection conn){
- try {
- Long beginTime = System.currentTimeMillis();
- conn.setAutoCommit(false);//手动提交
- PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");
- for(int i=0;i<100000;i++){
- pst.setInt(1, i);
- pst.execute();
- }
- conn.commit();
- Long endTime = System.currentTimeMillis();
- System.out.println("pst:"+(endTime-beginTime)/1000+"秒");//计算时间
- pst.close();
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
//3.使用PreparedStatement + 批处理
- public void exec3(Connection conn){
- try {
- conn.setAutoCommit(false);
- Long beginTime = System.currentTimeMillis();
- //构造预处理statement
- PreparedStatement pst = conn.prepareStatement("insert into t1(id) values (?)");
- //1万次循环
- for(int i=1;i<=100000;i++){
- pst.setInt(1, i);
- pst.addBatch();
- //每1000次提交一次
- if(i%1000==0){//可以设置不同的大小;如50,100,500,1000等等
- pst.executeBatch();
- conn.commit();
- pst.clearBatch();
- }
- }
- Long endTime = System.currentTimeMillis();
- System.out.println("pst+batch:"+(endTime-beginTime)/1000+"秒");
- pst.close();
- conn.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
在Oracle 10g中测试,结果:
1.使用statement 耗时142秒;
2.使用PreparedStatement 耗时56秒;
3.使用PreparedStatement + 批处理耗时:
a.50条插入一次,耗时5秒;
b.100条插入一次,耗时2秒;
c.1000条以上插入一次,耗时1秒;
通过以上可以得出结论,在使用jdbc大批量插入数据时,明显使用第三种方式(PreparedStatement + 批处理)性能更优。
-------------------------------------------------------------------------------------------------------------------------------
- 普通方式处理大量数据的insert时,处理速度相当慢。
- */
- PreparedStatement ps = null;
- //循环10000次
- for(int i = 0; i < 100000; i++) {
- ps = con.prepareStatement(sql);
- ps.executeUpdate();
- }
- 方法二:通过addBatch()的方式,将数据缓存在对象里面,通过最后执行executeBatch();方法提交,因此速度会快很多!
- */
- PreparedStatement ps = con.prepareStatement(sql);
- for(int i = 0; i < 100000; i++) {
- ps.setString(1, "1");
- ps.setString(2, "2");
- ps.addBatch();
- }
- ps.executeBatch();
用Java向数据库中插入大量数据时的优化的更多相关文章
- MySQL_(Java)使用JDBC向数据库中插入(insert)数据
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...
- 通过mybatis向数据库中插入日期数据
遇到的问题: 通过mybatis向数据库中插入日期格式数据,发现只有年月日, 没有小时分钟和秒 当你想在实体类中使用java.util.Date类型,而且还想在数据库中保存时分秒时, 解决办法: 你可 ...
- mysql/mariadb数据库在插入表数据时,ID竟然成奇数增加了?看完下面内容就知道怎么处理了。
今天突然被问到一个问题,mysql数据库插入表数据时,设置了ID自增,但是插入数据后,ID却呈奇数增加,不是123456类型,而是13579形式,突然有点懵,研究了一会,发现是auto_increme ...
- 003杰信-在jsp页面输入数据,然后在oracle数据库中插入factory数据,当字段允许为空时要特殊处理
本博客的内容全部来自于传智播客,特在此说明. 业务要求如下:在jsp页面(jFactoryCreate.jsp)上输入数据时,转到后台,并输入到数据库. jFactoryCreate.jsp页面:
- Java快速向数据库中插入大量数据 比如10万条以上
String sql = "insert into table *****"; //必须要有这句,要不然效果不明显 con.setAutoCommit(false); ps = c ...
- SQL 数据库连续插入大批量数据时超时
经常会处理大批量千万级的数据,一直以来都没问题.最近在处理时确出来了经常超时,程序跑一段时间就得停下来重启服务器,根据几次的调整发现了问题的所在,产生这类问题主要是以下几点所导致: 1.数据 ...
- Java程序向MySql数据库中插入的中文数据变成了问号
找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...
- MySQL_(Java)使用JDBC向数据库中修改(update)数据
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...
- MySQL_(Java)使用JDBC向数据库中删除(delete)数据
MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC向数据库中插入(insert)数据 传送门 MySQL_(Java)使用JDBC向数据库中删除(d ...
随机推荐
- [SDOI2016Round1]解题报告
Day1 T1: 题意:求∑n−1i=0∑m−1j=0max((i xor j)−k,0) 由于是抑或操作.每一位都是独立的,所以能够一位一位的算贡献. f[i][a][b][c]表示第i位时.每一个 ...
- Python装饰器(Decorator)简介
Python有许多出色的语言特性,装饰器(Decorator)便是其中一朵奇葩.先来看看一段代码: def deco1(f): print 'decorate 1' return f def deco ...
- AppCompat v23.2 -- Vectors的时代
表示速度真快啊,刚公布的23.2,就有人写blog了 原文:https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cb ...
- unity, 替换shader渲染(Rendering with Replaced Shaders)
实现特效,尤其是一些后处理特效,经常需要将各物体的shader替换为另一套shader进行渲染到纹理,再后再进行合成或以某种叠加方式叠加到最后的画面上去. 再复杂一点儿的,可能不同的物体所用的替换sh ...
- java开发常用到的jar包总结
commons-io.jar: FileUtils 读取文件所有行 File file = new File("c:\\123.txt"); List<String> ...
- etcd+calico集群的部署
etcd单机模式 设置环境变量 1 export HostIP="192.168.12.50" 执行如下命令,打开etcd的客户端连接端口4001和2379.etcd互联端口238 ...
- angular关于表单指令的汇总
- 方程式漏洞之复现window2008/win7 远程命令执行漏洞
前几天就想写的,因为一些缘故就没写.此次是在外网环境下进行的.大家在内网中也一个样. 方法: 使用Eternalblue模块,剑测是否有漏洞然后msf生成一个dll直接反弹shell. PS:win版 ...
- 如果本身kali就在局域网,shell在外网,怎么反弹连接呢?
kali虚拟机使用桥接,路由器端口映射监听的端口即可.
- sqlserver、mysql怎样获取连接字符串
sqlserver.mysql怎样获取连接字符串 步骤: 一.新建文本文档xxx.txt,改动文件类型为.udl 二.打开该文件,在<提供数据>中找到相应的服务. 三.在连接中选择须要的数 ...