Java PostgreSQL executeBatch()会随着时间的推移而变慢
我有一个程序,它使用Java PostgreSQL executeBatch()会随着时间的推移而变慢,java,sql,postgresql,jdbc,Java,Sql,Postgresql,Jdbc,我有一个程序,它使用PreparedStatement和upsert将类似“name1 name2 score”的行写入表中。所以我经常执行这个语句,将它添加到批处理中。批量大小为100,当它已满时,我会执行.executeBatch()和con.commit()(自动提交在开始时设置为false) 问题是,在程序运行的前10分钟,它将数据写入数据库muck的速度更快,然后在工作数小时后(相同的工作在启动时在1-2分钟内完成,在数小时后在10-20分钟内完成)。探查器说它94%的时间花在Sock
PreparedStatement
和upsert将类似“name1 name2 score”的行写入表中。所以我经常执行这个语句,将它添加到批处理中。批量大小为100,当它已满时,我会执行.executeBatch()
和con.commit()
(自动提交在开始时设置为false)
问题是,在程序运行的前10分钟,它将数据写入数据库muck的速度更快,然后在工作数小时后(相同的工作在启动时在1-2分钟内完成,在数小时后在10-20分钟内完成)。探查器说它94%的时间花在SocketInputStream.read()
:
那么,我能做些什么来防止这种可怕的减速呢?将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();
细节?PostgreSQL中没有“upsert”,那么您使用的是什么语句呢?在哪些PostgreSQL和PgJDBC版本上?在开始此过程之前,表是否为空,即它是否快速增长?如果是这样,经济放缓是正常的。