Mysql批量插入executeBatch的性能問題


http://blog.163.com/squall_smile/blog/static/60349840201181423337147/

 

移動MAS短信平台用的是Mysql 4.0.20版本。雖提供有各種接口,但DB接口相信是效率最高的。開發接口程序,使用JDBC連接,prepareStatement和 executeBatch批量插入數據,然而當每批量設為200條時,耗時約7秒左右。問題出在哪里?

     SmsSent.connMysql.setAutoCommit(false);
     SmsSent.logger.debug("Mysql批量執行開始");
     SmsSent.insMysql.executeBatch();
     SmsSent.logger.debug("Mysql批量插入");
     SmsSent.connSybase.setAutoCommit(false);
     SmsSent.updSybase.executeBatch();
     SmsSent.logger.debug("Sybase批量更新");
     SmsSent.connSybase.commit();
     SmsSent.logger.debug("Sybase批量更新成功。");
     SmsSent.connMysql.commit(); //

     SmsSent.logger.debug("Mysql批量更新成功。");
     SmsSent.connMysql.setAutoCommit(true);
     SmsSent.connSybase.setAutoCommit(true);
查看日志,會發現耗時主要出現在“mysql批量執行開始”和“Mysql批量插入”之間,其余操作包括Sybase的200條語句更新都是毫秒級的。查找文檔,得出以下結論:

老 版Mysql的JDBC驅動中對批量更新executeBatch仍是以逐條方式進行的,這一點有網友捕捉通訊報文得以證實。雖然已經使用了預編譯語句, 仍會與Mysql產生200次通訊交互,由於該移動服務器不在本省,ping之有30多毫秒的延遲,200X30就是將近6秒的時間,當然如此計算並不科 學,但仍能反映出問題所在。

所以結論就是200條更新的時間花費在通訊開銷上。

若要解決問題需使用Mysql的 JDBC驅動mysql-connector-java-5.1.13以上,此時可在連接URL中加入 rewriteBatchedStatements=true 來使其緩沖后批量更新以提高性能。從網友的測試結果上來看性能提高將近10倍以上。Mysql庫本身在3.1.13以上支持此參數。

悲劇的是,之前自己的測試證實Mysql 4.0.20是不支持5甚至4以上版本的JDBC驅動的(官方文檔中也有注明)。本人使用的是3.1.14版驅動,加入以上參數后,並未報錯,然而性能未有任何提高。

Mas升級mysql版本可能性不大,那么將程序放在Mas庫所在機器上倒可以解決問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM