1

私は現在、約4000のXMLファイルのフォルダーをループするJavaプログラムを作成しています。

forループを使用して、各ファイルからXMLを抽出し、それを文字列'xm​​lContent'に割り当て、PreparedStatementメソッドsetString(2、xmlContent)を使用して、SQLServerに格納されているテーブルに文字列を挿入します。

列「2」は、タイプXMLの「データ」と呼ばれる列です。

プロセスは機能しますが、時間がかかります。7秒ごとに約50行をテーブルに挿入します。

このプロセスをどのようにスピードアップできるかについて誰かが何かアイデアを持っていますか?

コード:

{ ...declaration, connection etc etc
        PreparedStatement ps = con.prepareStatement("INSERT INTO Table(ID,Data) VALUES(?,?)");

        for (File current : folder.listFiles()){
           if (current.isFile()){
              xmlContent = fileRead(current.getAbsoluteFile());
              ps.setString(1, current.getAbsoluteFile());
              ps.setString(2, xmlContent);
              ps.addBatch();

              if (++count % batchSize == 0){
                    ps.executeBatch();
              }

           }
        }
        ps.executeBatch();   // performs insertion of leftover rows
        ps.close();
}

private static String fileRead(File file){

         StringBuilder xmlContent = new StringBuilder();

         FileReader fr = new FileReader(file);
         BufferedReader br = new BufferedReader(fr);
         String strLine = "";
         br.readLine();      //removes encoding line, don't need it and causes problems
         while ( (strLine = br.readLine() ) != null){
             xmlContent.append(strLine);
         }
         fr.close();

         return xmlContent.toString();
     }
4

2 に答える 2

2

少し読んで簡単なテストを行うだけで、接続で autoCommit をオフにすることで、かなりのスピードアップが得られるようです。私が目にするすべてのバッチ クエリ チュートリアルでも、同様に推奨されています。http://www.tutorialspoint.com/jdbc/jdbc-batch-processing.htmなど

オフにしてから、必要な場所に明示的なコミットをドロップします(各バッチの最後、関数全体の最後など)。

 conn.setAutoCommit(false);
 PreparedStatement ps = // ... rest of your code

 // inside your for loop

     if (++count % batchSize == 0) 
     {
           try {
             ps.executeBatch();
             conn.commit();
           }
           catch (SQLException e)
           {
              // .. whatever you want to do
              conn.rollback();
           }
     }
于 2012-07-05T21:09:19.323 に答える
0

読み取りと書き込みを並列にするのが最善です。

1 つのスレッドを使用してファイルを読み取り、バッファーに格納します。別のスレッドを使用してバッファから読み取り、データベースでクエリを実行します。

複数のスレッドを使用して、データベースに並行して書き込むことができます。これにより、さらに優れたパフォーマンスが得られるはずです。

この MemoryStreamMultiplexer アプローチに従うことをお勧めします。この方法では、XML ファイルを 1 つのスレッドで読み取ってバッファーに格納し、1 つ以上のスレッドを使用してバッファーから読み取り、データベースに対して実行できます。

http://www.codeproject.com/Articles/345105/Memory-Stream-Multiplexer-write-and-read-from-many

これは C# の実装ですが、お分かりいただけると思います。

于 2012-07-09T14:36:09.703 に答える