簡體   English   中英

Java,如何更快地將許多記錄插入MySQL?

[英]How to insert many records to MySQL faster,Java?

我正在制作一個Web服務,其中即將出現許多記錄,因此必須更快地將它們插入數據庫。

我使用PreparedStatement 有什么方法可以更快地插入記錄?

數據是動態發送的,因此無法硬編碼要插入多少數據。 我有一個數據庫查詢常用的不同類,並且通過“ Servlet”調用它。

這是數據庫查詢代碼:

public void insertUser_Details(String name,String address) throws Exception {
    ps=con.prepareStatement("insert into registration_table(name,address) values(?,?)");
    ps.setString(1,name);  
    ps.setString(2,address);        
    ps.executeUpdate();
}

假設您在Employee有您的nameaddress ,現在您需要在db中插入許多 Employee記錄,則可以使用JDBC批處理操作並優化性能。

  PreparedStatement ps = con.prepareStatement("INSERT INTO registration_table(name,address) VALUES (?, ?)");   

  for(Employee employee: employees){
      ps.setString(1,employee.getName());
      ps.setString(2,employee.getAddress());
      ps.addBatch();// add to batch
      ps.clearParameters();
  }

  int[] results = ps.executeBatch();// execute with batch rather than execute many SQL separately. 

如果沒有實體對象(員工)來保存數據,也可以使用數組或集合輕松更改代碼以保存數據。

您可以閱讀Java中的批量插入以獲取更多信息

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
VALUES ('0', 'userid_0', 'content_0', 0);
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
VALUES ('1', 'userid_1', 'content_1', 1);

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);

我假設您要在單個表中插入一行。

如果您的插入不太可能失敗,並且您不需要回讀信息(例如,您不需要自動插入的密鑰),則可以使用INSERT DELAYED ,它將插入插入隊列並立即返回。

但是,即使立即插入也應該非常快。 您可能需要查看系統約束,並確定是否需要向數據庫服務器添加內存,CPU或IO容量。

我想到了兩個常見的優化,可以單獨使用或一起使用:

1)如果您的目標是能夠增加插入記錄的吞吐量,則可以考慮調整MySQL數據源連接池的大小。 如何完成取決於您使用的Web /應用程序服務器和連接池實現。

2)如果目標是保持服務器響應能力,那么您可以考慮執行異步插入,基本上是為了增加Web層的響應時間而使用額外的內存。 如果使用兼容J2EE 7的應用程序服務器,那么使用Java EE並發API相對容易,否則,即使J2EE規范不鼓勵使用“傳統” java.util.concurrent API,也應如此。它。

了解有關JPA(Java持久性Api)和Hibernate ORM的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM