java - PostgreSQLexecuteBatch() 随着时间的推移而变慢

标签 java sql postgresql jdbc

我有一个程序,它使用带 upsert 的 PreparedStatement 将诸如“name1 name2 Score”之类的行写入表中。所以我多次执行这个语句,并将其添加到批处理中。批量大小为 100,当它已满时,我执行 .executeBatch()con.commit() (自动提交在开始时设置为 false)。

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

enter image description here

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

最佳答案

将 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(); 

关于java - PostgreSQLexecuteBatch() 随着时间的推移而变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23853348/

相关文章:

postgresql - 用于重放审核的事件日志记录

java - 我如何打印线程状态?

c# - 使用 Linq 在 EF-Core 中进行 INNER Join 和 LEFT OUTER JOIN

r - 如何将数据从 PostgreSQL 数据库导入到 R?

SQL MIN() 更小/更大不能正常工作

sql - 如何使用 JOIN 将列从一个表复制到另一个表

postgresql - centos 中的 libpq 库

java - 获取 'Exception in thread "main"java.lang.IllegalArgumentException : Unknown entity: <entityClass>'

Java 使用 Graphics 创建动态但简单的图形

java - 通过 pubsubhub 实现类似聊天室的功能是个好主意吗