JDBC
當使用INSERT INTO....VALUES()語句批量插入的時候,應該使用JDBC的PreparedStatement的批量操作方法,而不是採用一條一條運行的方法。
比如(來源:http://superjavason.iteye.com/blog/255423):
如上圖,代碼有3個關鍵的處理步驟:
1)關閉自己主動提交
2)addBatch
3)executeBatch
使用這樣的方法,SQLite測試時的效果提升很明顯,從 10000/s提升到100000/s(數據僅做參考,不能作為決策根據)
須要注意的是:這樣的方式僅僅適合同樣結構的SQL語句批量運行。對于不同結構的SQL語句不能用這樣的方式,由于PreparedStatement在初始化的時候要指定sql
?
MySQL
使用上述參數后,MySQL的性能也有一定的提升。但提升不明顯。經過查找,確認和例如以下兩個參數有關:
- rewriteBatchedStatements=true
mysql默認關閉了batch處理, 通過此參數進行打開。 這個參數能夠重寫向 數據庫提交的SQL語句
- useServerPrepStmts=false
假設不開啟(useServerPrepStmts=false)。 使用com.mysql.jdbc.PreparedStatement進行本地SQL拼裝, 最后送到db上就是已經替換了?
后的終于SQL
?
經過測試。打開這2個參數后,mysql的批處理性能從1000多提升到50000多
具體請參考:http://blog.csdn.net/whucyl/article/details/20838079