Doj*_*ojo 3 java sql postgresql jdbc spring-jdbc
我需要UPSERTPostgres的功能.由于Postgres本身不支持这个,我编写了一个函数来执行该操作(尝试更新,如果没有更新行则插入)
这是该功能的模板:https://stackoverflow.com/a/1109198/681671
CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
$$
BEGIN
LOOP
-- first try to update the key
UPDATE db SET b = data WHERE a = key;
IF found THEN
RETURN;
END IF;
-- not there, so try to insert the key
-- if someone else inserts the same key concurrently,
-- we could get a unique-key failure
BEGIN
INSERT INTO db(a,b) VALUES (key, data);
RETURN;
EXCEPTION WHEN unique_violation THEN
-- do nothing, and loop to try the UPDATE again
END;
END LOOP;
END;
$$
LANGUAGE plpgsql;
SELECT merge_db(1, 'david');
Run Code Online (Sandbox Code Playgroud)
我正在使用Spring JDBC模板.这个select语句(以其参数化形式)和一个对象数组是我传递给JDBCTemplate的batchUpdate方法的.
我得到这个例外:
org.postgresql.util.PSQLException: A result was returned when none was expected.
Run Code Online (Sandbox Code Playgroud)
我怀疑是因为使用了SELECT.
我知道我可以在循环中使用Callable,但这会使应用程序非常繁琐,I/O延迟会使它变得非常慢.
如何使用Spring JDBC /原始JDBC在Postgres中完成批量upsert?
我正在使用Postgresql 9.1.
批处理upsert在PostgreSQL中通过以下方式完成:
TEMPORARY表INSERT或(最好)使用COPYPgJDBC驱动程序提供的API填充它LOCK真正的目标表IN EXCLUSIVE MODE,只允许SELECT来自其他事务的s继续.UPDATE ... FROM更新现有行INSERT INTO ... SELECT ... WHERE NOT EXISTS (SELECT 1 FROM real_table WHERE ...)以添加尚未包含的行real_tableCOMMIT交易如果多个事务尝试执行此操作,则会在表锁上进行序列化.upsert永远不会是一个兼容并发的操作.
| 归档时间: |
|
| 查看次数: |
2369 次 |
| 最近记录: |