PostgreSQL executeBatch()随着时间的推移而变慢

时间:2014-05-25 08:18:35

标签: java sql postgresql jdbc

我有一个程序,可以写出' name1 name2得分和#39;进入带有PreparedStatement并带有upsert的表。所以我很多时候执行这个语句,将它添加到批处理中。批量大小为100,当它完整时我做.executeBatch()con.commit()(自动提交在开始时设置为false)。

问题是,在程序工作的前10分钟,它将数据更快地写入数据库muck,然后在工作数小时后(相同的工作在开始的1-2分钟内完成,在10-20分钟后完成)几个小时)。分析师说94%的时间花在SocketInputStream.read()上:

enter image description here

那么我该怎样做才能防止这种可怕的减速?

1 个答案:

答案 0 :(得分:1)

将autoCommit设为false,并使用如下所示的预准备语句:

con.setAutoCommit(false);  // The connection
PreparedStatement prepStmt = con.prepareStatement("INSERT INTO table (val1,val2) VALUES (?,?)");

for all values:
  prepStmt.setString(1,val1);
  prepStmt.setString(2,val2);
  prepStmt.addBatch();    

prepStmt.executeBatch(); 
conn.commit();