我目前正在编写一个 Java 程序,该程序循环访问包含大约 4000 个 XML 文件的文件夹。
使用 for 循环,它从每个文件中提取 XML,将其分配给字符串“xmlContent”,并使用PreparedStatement 方法 setString(2,xmlContent) 将字符串插入到存储在我的 SQL Server 中的表中。
列“2”是 XML 类型的名为“Data”的列。
该过程有效,但速度很慢。它每 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();
}
}
关于java - 提高 SQL 从 JDBC (SQL Server) 插入 XML 列的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11351451/