Java Postgresql中的批处理更新
我需要在Postgres中升级功能。由于Postgres本身不支持这一点,因此我编写了一个函数,该函数会尝试更新,如果没有更新行,则插入 这是函数的模板: 我使用的是SpringJDBC模板。这个参数化形式的select语句和一个对象数组就是我传递给JDBCTemplate的batchUpdate方法的内容 我得到一个例外: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. 我怀疑
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.