如何快速的插入 100W資料到資料庫,使用PreparedStatement 最快實現!

菜鳥食譜發表於2021-03-10

有時候,我們使用資料庫的時候,如何快速的新增測試資料到資料庫中,做測試呢,新增100W 資料,如果使用工具的話可能很慢,這裡我推薦大家使用 PreparedStatement 預編譯 去進行操作:
單執行緒操作 ,測試 只需要 20秒 如果欄位少的話,可以到幾秒鐘插入100w資料

 public static void main(String[] args) {

        long start = System.currentTimeMillis();
        conn();
        long end = System.currentTimeMillis();
        System.out.println("耗時:" + (end - start)/1000 + "秒");
    }

    public static void conn(){
        //1.匯入驅動jar包
        //2.註冊驅動(mysql5之後的驅動jar包可以省略註冊驅動的步驟)
        //Class.forName("com.mysql.jdbc.Driver");
        //3.獲取資料庫連線物件
        Connection conn = null;
        PreparedStatement pstmt = null;
        {
            try {
                //"&rewriteBatchedStatements=true",一次插入多條資料,只插入一次
                conn = DriverManager.getConnection("jdbc:mysql://134.175.66.149:3306/test?" + "&rewriteBatchedStatements=true&serverTimezone=UTC","root","B5IWfkqW8uu36J");
                //4.定義sql語句
                String sql = "insert into user values(default,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
                //5.獲取執行sql的物件PreparedStatement
                pstmt = conn.prepareStatement(sql);
                //6.不斷產生sql
                for (int i = 0; i < 1000000; i++) {
                    pstmt.setString(1,(int)(Math.random()*1000000)+"");
                    pstmt.setString(2,(int)(Math.random()*1000000)+"");
                    pstmt.setString(3,(int)(Math.random()*1000000)+"");
                    pstmt.setString(4,(int)(Math.random()*1000000)+"");
                    pstmt.setString(5,(int)(Math.random()*1000000)+"");
                    pstmt.setString(6,(int)(Math.random()*1000000)+"");
                    pstmt.setString(7,(int)(Math.random()*1000000)+"");
                    pstmt.setString(8,(int)(Math.random()*1000000)+"");
                    pstmt.setString(9,(int)(Math.random()*1000000)+"");
                    pstmt.setString(10, DateUtil.now());

                    pstmt.setString(11,(int)(Math.random()*1000000)+"");
                    pstmt.setString(12,DateUtil.now());
                    pstmt.setString(13,(int)(Math.random()*1000000)+"");
                    pstmt.setString(14,(int)(Math.random()*1000000)+"");
                    pstmt.setString(15,(int)(Math.random()*1000000)+"");
                    pstmt.setString(16,(int)(Math.random()*1000000)+"");
                    pstmt.setString(17,(int)(Math.random()*1000000)+"");
                    pstmt.setString(18,(int)(Math.random()*1000000)+"");
                    pstmt.setString(19,(int)(Math.random()*1000000)+"");
                    pstmt.setString(20,(int)(Math.random()*1000000)+"");
                    pstmt.addBatch();
                }
                //7.往資料庫插入一次資料
                pstmt.executeBatch();
                System.out.println("新增1000000條資訊成功!");

            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                //8.釋放資源
                //避免空指標異常
                if(pstmt != null) {
                    try {
                        pstmt.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }

                if(conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }

 

相關文章