一、即便分批次用mybatis插入數據,效率依舊不高,原因:
MyBatis一次性批量插入幾千條數據,為什么性能很差?-騰訊云開發者社區-騰訊云
文中提出:
????????默認執行器類型為Simple,會為每個語句創建一個新的預處理語句,也就是創建一個PreparedStatement對象。在我們的項目中,會不停地使用批量插入這個方法,而因為MyBatis對于含有的語句,無法采用緩存,那么在每次調用方法時,都會重新解析sql語句。
????????從資料可知,耗時就耗在,由于我foreach后有5000+個values,所以這個PreparedStatement特別長,包含了很多占位符,對于占位符和參數的映射尤其耗時。并且,查閱相關資料可知,values的增長與所需的解析時間,是呈指數型增長的。
并且文中總結用mybatis需要將每次插入的記錄控制在 20~50 左右。
但是經本人測試,value數量為500、1000、1500、2000、2500 ... 10000,發現500時,每條數據插入時間為0.1秒左右,10000時,每條數據插入時間0.013秒左右,并未像作者提出的那樣,具體情況不得而知。
最后,還是建議用JDBC,因為真的很快 QAQ
二、批量插入數據效率對比,不同場景所用方案:
Mybatis與JDBC批量插入MySQL數據庫性能測試及解決方案 - 竹馬今安在 - 博客園
三、JDBC批量插入數據
Connection conn = null;PreparedStatement pstm =null;ResultSet rt = null;String host = System.getenv("DATA_MYSQL_HOST");String port = System.getenv("DATA_MYSQL_PORT");String database = System.getenv("DATA_MYSQL_DATABASE");//rewriteBatchedStatements=true 開啟批量處理String url = String.format("jdbc:mysql://%s:%s/%s?rewriteBatchedStatements=true", host, port, database);String user = System.getenv("DATA_MYSQL_USER");String password = System.getenv("DATA_MYSQL_PASSWORD");try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection(url, user, password);String sql = "INSERT INTO t_table(name, create_data, value) VALUES(?,?,?)";pstm = conn.prepareStatement(sql);conn.setAutoCommit(false);//計算插入時間Long startTime = System.currentTimeMillis();for (int i = 0; i < tables.size(); i++) {Point point = points.get(i);pstm.setString(1, point.getName());pstm.setTimestamp(2, new Timestamp(point.getCreateDate().getTime()));pstm.setBigDecimal(3, point.getValue());pstm.addBatch();}pstm.executeBatch();conn.commit();Long endTime = System.currentTimeMillis();System.out.println("OK,用時:" + (endTime - startTime));} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);} finally{if (pstm != null) {try {pstm.close();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}}
參考:JDBC實現往MySQL插入百萬級數據 - 酒香逢 - 博客園