zoukankan      html  css  js  c++  java
  • 【JDBC】使用Spring提供的JDBCTemplate通过Statement向MySql数据库插入千万条数据,耗时40m24s

    数据库还和以往一样,但操作数据库的由MyBatis转变成了Spring提供的JdbcTemplate,并采用了Statement批量提交方式,代码如下:

    package com.hy.action.jdbc;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.text.MessageFormat;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    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 BatchJDBCInsert {
        private static Logger logger = Logger.getLogger(BatchJDBCInsert.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&stmt
            Connection conn=null;
            Statement stmt=null;
            
            try {
                conn =jt.getDataSource().getConnection();
                conn.setAutoCommit(false);
                stmt = conn.createStatement();
                
                String ctime="2017-11-01 00:00:01";
                int index=0;
                
                for(int i=0;i<10000;i++) {
                    for(int j=0;j<1000;j++) {
                        index++;
                        
                        String insertSql="insert into emp(name,age,cdate) values ({0},{1},{2}) ";
                        Object arr[]={"'E:"+index+"'",index % 100,"'"+ctime+"'"};
                        String sql=MessageFormat.format(insertSql, arr);
                        stmt.addBatch(sql);
                        
                        ctime=timePastOneSecond(ctime);
                    }
                    
                    stmt.executeBatch();
                    stmt.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 {
                    stmt.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+"'.");
                }
            }
        }
        
        public static String timePastOneSecond(String otime) {
            try {
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date dt=sdf.parse(otime);
                
                Calendar newTime = Calendar.getInstance();
                newTime.setTime(dt);
                newTime.add(Calendar.SECOND,1);
                
                Date dt1=newTime.getTime();
                String retval = sdf.format(dt1);
                
                return retval;
            }
            catch(Exception ex) {
                ex.printStackTrace();
                return null;
            }
        }
        
         // format seconds to day hour minute seconds style
        // Example 5000s will be formatted to 1h23m20s
        public 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] - #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:40m24s.

    数据库的情况:

    现在看,它的速度仅比一条条插要好一些。

    --END-- 2019年10月13日13:23:09

  • 相关阅读:
    线程池参数设置技巧
    线程池的七个参数
    bug篇——Windows启动redis报错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error
    总结篇——git本地仓库上传更新到github
    实例篇——springboot自定义拦截器
    总结篇——从零搭建maven多模块springboot+mybatis项目
    bug篇——MySQL的时区问题
    工具类篇——时间处理Calendar类
    安装篇——nginx安装ssl模块转发https请求
    总结篇——nginx代理服务器
  • 原文地址:https://www.cnblogs.com/heyang78/p/11666169.html
Copyright © 2011-2022 走看看