提高SQL的速度从JDBC插入XML列(SQL Server)

问题描述:

我目前正在编写一个Java程序,它循环遍历4000个XML文件的文件夹。提高SQL的速度从JDBC插入XML列(SQL Server)

使用for循环,它从每个文件中提取XML,将其分配给String'xmlContent',并使用PreparedStatement方法setString(2,xmlContent)将String插入存储在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(); 
    } 

只是从一个小阅读和快速测试 - 它看起来像你可以通过你的连接关闭自动提交得到一个体面的加速。我看到的所有批处理查询教程都会推荐它。如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(); 
      } 
    } 

最好使读取和写入并行。

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

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

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

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

这是一个C#实现,但你的想法。