2016-12-30 10 views
0

コンピュータから3.5秒で2000レコードを挿入できますが、GAEは同じことをするのに14.0秒かかります。 rewriteBatchedStatements設定を使用するようにGoogleドライブを取得する方法がわかりません。ここでGoogle Cloud Engine(JDBCを使用)がGoogle App Engineのレコードをパーソナルコンピュータよりも挿入するのに時間がかかるのはなぜですか?

は私の関連するJavaコードです:一般的に

package year2016.tax8949.database2; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 
import java.util.List; 
import java.util.Properties; 
import java.util.logging.Logger; 

public class Form89492016TableInserter { 

private static final Logger log 
    = Logger.getLogger("Form89492016TableInserter"); 

protected static final String USERNAME = "xxxx"; 

protected static final String PASSWORD = "xxxxx"; 

protected static final String INSTANCE_CONNECTION_NAME 
    = "xxxx:us-central1:xxxxx"; 

protected static final String DB_NAME = "xxxxxx"; 

protected static final String IP_ADDRESS = "xxx.1xx.2xx.4x"; 

protected static final String SQL_INSERT 
    = "INSERT into Forms1099B (orderNumber,acctId,qty,secDesc,dateAcq,dateSold,salesPrice,cost,basisAdj,washAdj,nomineeAdj,otherAdj,term,basisRep,rep1099B,tranType,dateAcqVar,covered,symbol,expired) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; 


// Whether connecting from Google App Engine 
private boolean fromGAE = false; 

// JDBC connection 
private Connection conn = null; 

public Form89492016TableInserter(boolean fromGAE) { 
    this.fromGAE = fromGAE; 
} 

public void insertBatch(List<Forms1099BRecordBean> records) { 

    int batchSize = 500; 

    insertBatchUsingSize(records, batchSize); 
} 

public void insertBatchUsingSize(List<Forms1099BRecordBean> records, 
            int batchSize) { 

    try { 

     initializeConnection(); 

     doInsertions(records, batchSize); 

     closeConnection(); 

    } 
    catch(SQLException e) { 
     log.severe(e.getMessage()); 
    } 

} 

public void closeConnection() throws SQLException { 

    if (conn != null) { 
     conn.close(); 
    } 

} 

public void initializeConnection() throws SQLException { 

    String driverName 
     = (fromGAE) ? "com.mysql.jdbc.GoogleDriver" : 
         "com.mysql.jdbc.Driver"; 

    try { 
     Class.forName(driverName); 
    } 
    catch(ClassNotFoundException e) { 
     log.severe(e.getMessage()); 
     return; 
    } 

    if (fromGAE) { 

     String connectionString 
      = String.format( 
       "jdbc:google:mysql://%s/%s?user=root&password=%s", 
       INSTANCE_CONNECTION_NAME, 
       DB_NAME, 
       PASSWORD); 

     conn = DriverManager.getConnection(connectionString); 

    } 
    else { 

     String url = String.format("jdbc:mysql://%s:3306/%s", 
            IP_ADDRESS, 
            DB_NAME); 

     Properties props = new Properties(); 
     props.setProperty("user", USERNAME); 
     props.setProperty("password", PASSWORD); 
     props.setProperty("rewriteBatchedStatements", "true"); 

     conn = DriverManager.getConnection(url, props);  

    } 

} 

private void doInsertions(List<Forms1099BRecordBean> records, 
          int batchSize) throws SQLException { 

    try (PreparedStatement stmt = conn.prepareStatement(SQL_INSERT)) { 

     for (int i = 0; i < records.size(); i++) { 

      Forms1099BRecordBean item = records.get(i); 

      stmt.setString(1, item.getOrderNumber()); 
      stmt.setString(2, item.getAcctId()); 
      stmt.setString(3, item.getQty()); 
      stmt.setString(4, item.getSecDesc()); 
      stmt.setDate(5, item.getDateAcq()); 
      stmt.setDate(6, item.getDateSold()); 
      stmt.setBigDecimal(7, item.getSalesPrice()); 
      stmt.setBigDecimal(8, item.getCost()); 
      stmt.setBigDecimal(9, item.getBasisAdj()); 
      stmt.setBigDecimal(10, item.getWashAdj()); 
      stmt.setBigDecimal(11, item.getNomineeAdj()); 
      stmt.setBigDecimal(12, item.getOtherAdj()); 
      stmt.setString(13, item.getTerm()); 
      stmt.setString(14, item.getBasisRep()); 
      stmt.setString(15, item.getRep1099B()); 
      stmt.setString(16, item.getTranType()); 
      stmt.setString(17, item.getDateAcqVar()); 
      stmt.setString(18, item.getCovered()); 
      stmt.setString(19, item.getSymbol()); 
      stmt.setString(20, item.getExpired()); 

      stmt.addBatch(); 

      // Execute every N items. 
      if ((i + 1) % batchSize == 0) { 
       stmt.executeBatch();  
      } 

     } 

     stmt.executeBatch(); 

    } 

} 

} 

答えて

1

それはリンゴ対リンゴの比較ではありませんとして、それは、GAE上でのパフォーマンスをローカルマシンの性能を比較するためにあまり意味がありません。

  • これらの日がはるかに強力なGAE instance classマシン
  • よりも(これは速いか遅い意味場合donno)ローカルマシンがそうGAEは、異なるOSを実行しているほとんどのローカルマシン
  • ローカルマシンは、典型的には、GAEのインスタンスは、コンテナまたは仮想マシン
  • で実行、ベアメタルプラットフォーム上のOSを実行SDKは(の部分)GAE赤外線コード機能ではなく、実際 GAE赤外線コード
  • のちょうどエミュレータであります
  • GAEサービスは実際にはアプリケーションのインスタンス上では実行されず、RPC経由でアクセスされます。内部GAEネットワークは非常に高速ですが、ローカルマシンの内部にある同等のSDKエミュレーションよりもずっと遅いです。
+0

パフォーマンスの違いを説明できるGAEの属性を明らかにしていただきありがとうございます。 私の実際の質問にもっと焦点を当てるために、多分私の質問に異なった枠組みをつけたはずです: GAE JDBCのパフォーマンスを最適化するにはどうしたらいいですか? または、私は、GAE JDBCドライバの仕組みに関する質問に焦点を当てていたはずです。 "executeBatch()"コマンドを実行すると、GAE JDBCの実装で複数のラウンドトリップが行われますか? または Googleドライブで「rewriteBatchedStatements」プロパティを「true」に設定するにはどうすればよいですか? 私は様々な方法で試してみましたが、どれも動作しません。 –

+0

はい、それに応じて質問を更新する必要があります。 –

関連する問題