菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
234
0

【JDBC】使用Spring提供的JDBCTemplate通过PrepareStatement向MySql数据库插入千万条数据,耗时32m47s,速度提升有限

原创
05/13 14:22
阅读数 12431

数据库环境还和原来一样,只是从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

 

发表评论

0/200
234 点赞
0 评论
收藏