【问题标题】:Improve speed of SQL Inserts into XML column from JDBC (SQL Server)提高从 JDBC (SQL Server) 向 XML 列插入 SQL 的速度
【发布时间】:2012-07-05 19:43:19
【问题描述】:

我目前正在编写一个 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();
     }

【问题讨论】:

    标签: java xml performance sql-server-2008 jdbc


    【解决方案1】:

    只需阅读一些内容和快速测试即可 - 看来您可以通过关闭连接上的 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();
               }
         }
    

    【讨论】:

      【解决方案2】:

      最好让读写并行。

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-24
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多