1

我目前正在编写一个 Java 程序,它遍历一个包含大约 4000 个 XML 文件的文件夹。

使用 for 循环,它从每个文件中提取 XML,将其分配给字符串“xmlContent”,并使用 PreparedStatement 方法 setString(2,xmlContent) 将字符串插入存储在我的 SQL Server 中的表中。

列“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

最好使读写并行。

使用一个线程读取文件并存储在缓冲区中。使用另一个线程从缓冲区读取并在数据库上执行查询。

您可以使用多个线程并行写入数据库。这应该会给你更好的性能。

我建议您遵循这种 MemoryStreamMultiplexer 方法,您可以在一个线程中读取 XML 文件并存储在缓冲区中,然后使用一个或多个线程从缓冲区中读取并针对数据库执行。

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

这是一个 C# 实现,但你明白了。

于 2012-07-09T14:36:09.703 回答