2015-09-29 67 views
3

我最近將Apache Tomcat JDBC連接池合併到我的應用程序(使用MySQL DB)。我之前嘗試過使用Apache DBCP,但不喜歡它的結果,即使我運行獨立的Java應用程序並且完全不使用tomcat,tomcat實現似乎也符合我的需求。Apache Tomcat JDBC連接池在批量批量插入時性能不佳

最近,我在執行批量(又名批量)插入查詢時遇到了巨大的性能問題。

我有一個流程,我以批處理的方式將2500條記錄插入表中。在使用jdbc連接池時需要花費很長時間,相比之下,當恢復爲每個查詢打開一個連接(不使用池)時,需要幾秒鐘的時間。

我寫了一個小應用程序,插入30行到同一個表。共用時需要12秒,當不共用時需要800毫秒。

在使用連接池之前,我使用了com.mysql.jdbc.jdbc2.optional.MysqlDataSource作爲我的數據源。連接已配置了以下行:

dataSource.setRewriteBatchedStatements(true); 

我敢肯定,這是兩種方法之間的核心差異,但找不到在JDBC池的等效參數。

回答

4

MySql JDBC驅動程序不支持批處理操作。 RewriteBatchedStatement是你可以得到的最好的。這裏從MySQL PreparedStatement.java代碼:

try { 
      statementBegins(); 

      clearWarnings(); 

      if (!this.batchHasPlainStatements && this.connection.getRewriteBatchedStatements()) { 

       if (canRewriteAsMultiValueInsertAtSqlLevel()) { 
        return executeBatchedInserts(batchTimeout); 
       } 

       if (this.connection.versionMeetsMinimum(4, 1, 0) && !this.batchHasPlainStatements && this.batchedArgs != null 
         && this.batchedArgs.size() > 3 /* cost of option setting rt-wise */) { 
        return executePreparedBatchAsMultiStatement(batchTimeout); 
       } 
      } 

      return executeBatchSerially(batchTimeout); 
     } finally { 
      this.statementExecuting.set(false); 

      clearBatch(); 
     } 

這就是爲什麼我不喜歡MySQL和喜歡Postgres的一個原因

編輯:

您應該結合連接池,批量操作,並RewriteBatchedStatement選項。您可以通過jdbc url參數設置RewriteBatchedStatement選項:jdbc:mysql://localhost:3307/mydb?rewriteBatchedStatements=true

+0

10x爲答案。我不介意批處理操作是否是「半」純的,只要他們花費最少的時間,就像我在問題底部展示的那樣。我在jdbc-pool(或任何其他池)中尋找這些「半」純批處理的等價物。 – KidCrippler

+1

您應該將參數'?rewriteBatchedStatements = true'添加到jdbc url。 – sibnick

+0

10倍,解決了性能問題! – KidCrippler