2012-01-25 24 views
1

Oracleサーバーからデータを収集し、データをフォーマットして暗号化し、それをMS SQLサーバーに挿入するメソッドを作成しました。この方法では約60000レコードが移動し、少し時間がかかり、少しばかりです。誰かがそれをきれいにして速くする場所を見ることができますか?メソッドが長すぎる

改善が必要な領域は、結果セットがリストに追加されるときです。リストが一度に1000行ずつMS SQLテーブルに挿入されているとき。

public static void get_random_selection(Connection ora_conn, Connection sql_conn) throws Exception, SQLException{ 

    Statement sql_stmt = sql_conn.createStatement(); 
    Statement ora_stmt = ora_conn.createStatement(); 

    ResultSet sql_rs = null; 
    ResultSet ora_rs = null; 

    //Select the max QUARTER from RANDOM_SELECTION in MS SQL 
    sql_rs = sql_stmt.executeQuery("SELECT MAX(QUARTER) FROM RANDOM_SELECTION"); 

    sql_rs.next(); 
    int max_from_mssql = sql_rs.getInt(1); 

    ora_rs = ora_stmt.executeQuery("SELECT MAX(QUARTER) FROM RANDOM_SELECTION"); 

    ora_rs.next(); 
    int max_from_oracle = ora_rs.getInt(1); 

    //If the max_from_oracle is larger than max_from_mssql than the AL's and RL's in Oracle 
    //are fresher and need to be moved to MS SQL 
    //if (max_from_oracle > max_from_mssql){ 
    if(1==1){ 

     System.out.println("The RANDOM_SELECTION table in Oracle is more up to date than the RANDOM_SELECTION table in MS SQL."); 

     System.out.println("Retrieving RANDOM_SELECTION data from Oracle."); 

     //select items from RANDOM_SELECTION and DROPPER_CITY_BRK_2 that need to be moved 
     ora_rs = ora_stmt.executeQuery("select distinct(random_selection.randnum), " 
          + "random_selection.quarter, " 
          + "random_selection.ozip3, " 
          + "random_selection.boxid, " 
          + "random_selection.boxaddr, " 
          + "random_selection.locdesc, " 
          + "random_selection.loccity, " 
          + "random_selection.lastmf, " 
          + "random_selection.lastsat, " 
          + "random_selection.boxtype, " 
          + "random_selection.svcclas, " 
          + "random_selection.dropzip5, " 
          + "random_selection.dropper_id " 
         + "from random_selection " 
         + "where random_selection.dropper_id is not null " 
         + "and random_selection.quarter = " + max_from_oracle + " " 

        + "union " 

         + "select distinct(random_selection.randnum), " 
          + "random_selection.quarter, " 
          + "random_selection.ozip3, " 
          + "random_selection.boxid, " 
          + "random_selection.boxaddr, " 
          + "random_selection.locdesc, " 
          + "random_selection.loccity, " 
          + "random_selection.lastmf, " 
          + "random_selection.lastsat, " 
          + "random_selection.boxtype, " 
          + "random_selection.svcclas, " 
          + "random_selection.dropzip5, " 
          + "dropper_city_brk_2.dropper_id " 
         + "from random_selection, dropper_city_brk_2, dropper " 
         + "where random_selection.ozip3 = dropper_city_brk_2.zip3 " 
         + "and dropper.dropper_id = dropper_city_brk_2.dropper_id " 
         + "and dropper.active = 1 " 
         + "and dropper_city_brk_2.dropper_id <> 10002 " 
         + "and random_selection.quarter = " + max_from_oracle + " " 
         + "and random_selection.dropper_id is null"); 

     System.out.println("Retrieved RANDOM_SELECTION data from Oracle."); 

     List<String[]> random_selection = new ArrayList<String[]>(); 

     System.out.println("Assigning ResultSet to List."); 

     while (ora_rs.next()){ 
      random_selection.add(new String[]{ 
       ora_rs.getString("RANDNUM"), 
       ora_rs.getString("QUARTER"), 
       ora_rs.getString("OZIP3"), 
       ora_rs.getString("BOXID"), 
       ora_rs.getString("BOXADDR").replace("'"," "), 
       ora_rs.getString("LOCDESC") == null ? ora_rs.getString("LOCDESC") : ora_rs.getString("LOCDESC").replace("'",""), 
       ora_rs.getString("LOCCITY").replace("'", " "), 
       ora_rs.getString("LASTMF"), 
       ora_rs.getString("LASTSAT").equals("11:58pm") ? "null": ora_rs.getString("LASTSAT"), 
       ora_rs.getString("BOXTYPE"), 
       ora_rs.getString("SVCCLAS"), 
       ora_rs.getString("DROPZIP5"), 
       ora_rs.getString("DROPPER_ID")}); 

      System.out.println(ora_rs.getRow()); 
     } 

     System.out.println("Finished assigning ResultSet to List."); 

     //leading statement for the following loop 
     String query = "insert into random_selection " 
        + "(RANDNUM,QUARTER,OZIP3,BOXID,BOXADDR,LOCDESC,LOCCITY,LASTMF,LASTSAT,BOXTYPE,SVCCLAS,DROPZIP5,DROPPER_ID) VALUES"; 

     int jj = 0; 

     //loop through random_selection_array creating an INSERT statement to insert 999 entries at a time 
     //this is done to speed up the process 
     for(int ii = 0;ii<random_selection.size();ii++){ 

      String[] array_holder = random_selection.get(ii); 

      query = query 
        + "(" 
        + "'"+array_holder[0]+"'," 
        + "'"+array_holder[1]+"'," 
        + "'"+array_holder[2]+"'," 
        + "'"+array_holder[3]+"'," 
        + "'"+array_holder[4]+"'," 
        + "'"+array_holder[5]+"'," 
        + "'"+array_holder[6]+"'," 
        + "'"+array_holder[7]+"'," 
        + "'"+array_holder[8]+"'," 
        + "'"+array_holder[9]+"'," 
        + "'"+array_holder[10]+"'," 
        + "'"+array_holder[11]+"'," 
        + "'"+new sun.misc.BASE64Encoder().encode(encrypt(array_holder[12]))+"'),"; 

      //every 999 iterations enter here 
      if (jj > 998){ 
       //add |%| to the end of the string so that you can remove the final ',' 
       query = query+"|%|"; 
       query = query.replace(",|%|",""); 

       System.out.println(query); 

       //sql_stmt.executeUpdate(query); 
       query = "insert into random_selection (RANDNUM,QUARTER,OZIP3,BOXID,BOXADDR,LOCDESC,LOCCITY,LASTMF,LASTSAT,BOXTYPE,SVCCLAS,DROPZIP5,DROPPER_ID) VALUES"; 
       jj = 0; 
      } 
      jj++; 

      //the last few entries will be added one at a time to prevent nulls records from being inserted 
      if (ii > (random_selection.size()/999) * 999){ 
       //add |%| to the end of the string so that you can remove the final ',' 
       query = query+"|%|"; 
       query = query.replace(",|%|",""); 

       System.out.println(query); 

       //sql_stmt.executeUpdate(query); 
       query = "insert into random_selection (RANDNUM,QUARTER,OZIP3,BOXID,BOXADDR,LOCDESC,LOCCITY,LASTMF,LASTSAT,BOXTYPE,SVCCLAS,DROPZIP5,DROPPER_ID) VALUES"; 
      } 
     } 
    } 
} 

クライアントが2つのサーバ間の任意の開いている接続を控えたい:ここ

はコードです。

+3

おそらく、ここで質問する必要があります:http://codereview.stackexchange.com/ – Max

+0

この方法はあまりにも多くのことを行います。それは従うべき痛みであり、いくつかのリファクタリングを使用することができます。 btw、あなたはデータベース内のすべてを行うには、MS SQLサーバーにリンクサーバーを追加することはできますか? –

+2

@Mike - コードは絶対にJavaである必要がありますか?一般に、ソースデータベースからすべてのデータをネットワーク経由で読み込み、処理してから、ネットワーク経由ですべて書き戻すのはかなりコストがかかるでしょう。構造的には、データがあるデータベースから別のデータベースに直接送信された方が効率的です。たとえば、SQL Serverを指すOracleデータベースリンクを作成し、Oracleストアドプロシージャでアプリケーションサーバーに中間ホップなしで直接SQL Serverにデータを書き込むようにすることができます。 –

答えて

1

この問題は、MS SQLサーバーで多数の挿入が行われていることが原因です。そうすることはあまり効率的ではありません。

2つのデータベース間で(リンクなしで)データを転送する正しい方法は、bcpの行の入出力です。

まず、私はsybase以外のBCPに関する経験はありません。

  1. データをMS bcp形式にする方法を解説します。これを行うにはいくつかの方法があります。私はoracle dbとbcp outに必要なすべてのビューを作成しようとしますが、それはencrypt()のものでは不可能かもしれません。インチ

0

まず

  • BCP、代わりに推測する、あなたは実際に、それは実際にあなたが遅いと思いますそれらの領域ごとにかかる時間コンソールに書き出す必要があります。 :)第二に、準備されたステートメントを使用し、addBatchとexecuteBatchを使用する必要があります。 C#ではSqlBulkCopyを使用しますが、Javaにはそのようなクラスがないと思うので、addBatchとexecuteBatchを試してみてください。それでもまだ遅すぎる場合は、BULK INSERTを使用します:http://msdn.microsoft.com/en-us/library/ms188365.aspx

  • 関連する問題