Java 使用长时间运行的存储过程对Postgres/JPA/Spring进行故障排除
我在从DAO调用的几个长时间运行的存储过程调用中遇到了问题,这些调用不会将控制权返回给调用DAO的服务 以下是模式: 在每年运行一次的AWS SWF工作流中,我有一个服务需要调用5个存储过程来填充Postgres数据库中的5个摘要表。所有5个过程都具有相同的格式,并且非常简单。他们各自从同一个明细表中读取数据,并以不同的方式对数据进行过滤/分组以进行汇总。对于每个(同步调用),服务:Java 使用长时间运行的存储过程对Postgres/JPA/Spring进行故障排除,java,spring,postgresql,jpa,amazon-swf,Java,Spring,Postgresql,Jpa,Amazon Swf,我在从DAO调用的几个长时间运行的存储过程调用中遇到了问题,这些调用不会将控制权返回给调用DAO的服务 以下是模式: 在每年运行一次的AWS SWF工作流中,我有一个服务需要调用5个存储过程来填充Postgres数据库中的5个摘要表。所有5个过程都具有相同的格式,并且非常简单。他们各自从同一个明细表中读取数据,并以不同的方式对数据进行过滤/分组以进行汇总。对于每个(同步调用),服务: 启动新事务 调用DAO方法 DAO方法使用JPA的StoredProcedureQuery调用plpgsql存储
idleMaxAgeInMinutes=5
idleConnectionTestPeriodInMinutes=1
所有5个存储过程都使用此格式:
CREATE OR REPLACE FUNCTION summarize_abc(p_id INTEGER) RETURNS BOOLEAN AS $$
DECLARE
BEGIN
insert into summary_table (a, b, c, d, e, inserted_on)
select p_id, b, c, d, sum(e) as AMOUNT, CURRENT_TIMESTAMP
from detail_table s
where
s.id = p.id
group by a, b, c, d;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
DAO方法都是这样的:
public void summarizeA(int id) {
ProviderAccess pa = getProviderAccess();
EntityManager entityManager = getEntityManager();
StoredProcedureQuery query = entityManager.createStoredProcedureQuery(pa.getSchemaName() +
".summarize_abc");
query.registerStoredProcedureParameter("p_id", Integer.class, ParameterMode.IN);
query.setParameter("p_id", id);
query.execute();
}