Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Postgresql中的批处理更新_Java_Sql_Postgresql_Jdbc_Spring Jdbc - Fatal编程技术网

Java Postgresql中的批处理更新

Java Postgresql中的批处理更新,java,sql,postgresql,jdbc,spring-jdbc,Java,Sql,Postgresql,Jdbc,Spring Jdbc,我需要在Postgres中升级功能。由于Postgres本身不支持这一点,因此我编写了一个函数,该函数会尝试更新,如果没有更新行,则插入 这是函数的模板: 我使用的是SpringJDBC模板。这个参数化形式的select语句和一个对象数组就是我传递给JDBCTemplate的batchUpdate方法的内容 我得到一个例外: org.postgresql.util.PSQLException: A result was returned when none was expected. 我怀疑

我需要在Postgres中升级功能。由于Postgres本身不支持这一点,因此我编写了一个函数,该函数会尝试更新,如果没有更新行,则插入

这是函数的模板:

我使用的是SpringJDBC模板。这个参数化形式的select语句和一个对象数组就是我传递给JDBCTemplate的batchUpdate方法的内容

我得到一个例外:

 org.postgresql.util.PSQLException: A result was returned when none was expected.
我怀疑这是因为使用了SELECT

我知道我可以在循环中使用Callable,但这会使应用程序非常健谈,I/O延迟会使它非常慢

如何使用SpringJDBC/RawJDBC在Postgres中进行批量升级


我正在使用Postgresql 9.1。

我对postgres不太了解,但我通常的方法如下:

插入 如果因唯一的_冲突而失败,请执行更新 我这样做是为了最小化表上的锁,并防止竞争条件


当然,只有在插入到的表对主键以外的列具有唯一约束时,它才会起作用。

批升级是通过以下方式在PostgreSQL中完成的:

开始交易 创建临时表 使用JDBC批处理插入或最好使用PgJDBC驱动程序提供的复制API填充它 在独占模式下锁定实际目标表,这只允许继续从其他事务中进行选择。 正在进行更新。。。从中更新现有行 正在插入到。。。选择如果不存在,请从real_表中选择1,其中。。。添加不在real_表中的行的步骤 提交交易
如果多个事务试图这样做,它们将在表锁上序列化。upsert永远不会是一个并发友好的操作。

请参阅@CraigRinger:Thank会尝试的。但仍在寻找一个确认,即在使用JDBC+Postgres时,无法批处理对过程的多个参数化调用。我看到了语句接口的addBatch方法,它做了一些类似于我想要的事情,但它不接受参数。必须序列化应用程序代码中的参数并提供SQL字符串。有许多参数,每个参数都可能出错。您能告诉我们如何从Java调用函数吗?
 org.postgresql.util.PSQLException: A result was returned when none was expected.