[英]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
有您的name
和address
,現在您需要在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.