提高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#实现,但你的想法。