与PostgreSQL的多个连接,包含大量INSERT

时间:2014-02-04 21:08:36

标签: postgresql jdbc postgresql-performance

这个问题涉及到这个问题:How to speed up insertion performance in PostgreSQL

所以,我有一个java应用程序,它在PostgreSQL数据库中执行了大量(aprox。十亿)INSERT。它会打开几个到同一个DB的JDBC连接,以便并行执行这些插入。正如我在上面提到的问题所解释的那样:

  

从多个连接并行插入或复制。多少取决于   在您的硬件磁盘子系统上;根据经验,你想要一个   如果使用直连存储,则每个物理硬盘连接。

但在我的情况下,我的数据库只有一个磁盘存储空间

所以,我的问题是:在这种情况下,它真的有可能打开几个连接吗?由于I / O操作竞争,它能否降低性能而不是期望的增加?

为了澄清,这是实际postgresql进程加载的图片:

enter image description here

1 个答案:

答案 0 :(得分:-1)

由于您在Java应用程序中提到了INSERT,我假设(使用纯JDBC)COPY并不是您正在寻找的。如果不使用JPA等API或Spring-data等框架,我可以介绍addBatch()executeBatch(),以防您没有听说过这些:

/*
 the whole nine yards
 */
Connection c = ...;
PreparedStatement ps = c.prepareStatement("INSERT INTO table1(columnInt2,columnVarchar)VALUES(?,?)");

然后循环读取数据:

ps.setShort(1, someShortValue);
ps.setString(2, someStringValue);
ps.addBatch();  // one row at a time from human's perspective

准备好所有行的数据时:

ps.executeBatch();

我还建议: