Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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 使用长时间运行的存储过程对Postgres/JPA/Spring进行故障排除_Java_Spring_Postgresql_Jpa_Amazon Swf - Fatal编程技术网

Java 使用长时间运行的存储过程对Postgres/JPA/Spring进行故障排除

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存储

我在从DAO调用的几个长时间运行的存储过程调用中遇到了问题,这些调用不会将控制权返回给调用DAO的服务

以下是模式: 在每年运行一次的AWS SWF工作流中,我有一个服务需要调用5个存储过程来填充Postgres数据库中的5个摘要表。所有5个过程都具有相同的格式,并且非常简单。他们各自从同一个明细表中读取数据,并以不同的方式对数据进行过滤/分组以进行汇总。对于每个(同步调用),服务:

  • 启动新事务
  • 调用DAO方法
  • DAO方法使用JPA的StoredProcedureQuery调用plpgsql存储过程
  • 当DAO方法完成时,服务将更新一个单独的活动表,以指示摘要活动已完成
  • 对于5个存储过程中的3个,此模式有效。存储过程提交其工作并更新摘要活动。但是,对于2个运行时间更长的存储过程调用(20分钟以上),DAO从不将控制权返回给服务。存储过程方法确实将它们的工作提交到数据库,因为这是plpgsql方式,但是因为DAO似乎永远不会返回到服务,所以我的活动表不会更新以显示该过程已经完成。SWF工作流也一直在运行,因为服务调用尚未完成。我让它运行了一夜,发现尽管存储的proc将数据保存到了摘要表中,但服务/DAO调用在12小时后仍在运行

    我不知道我的问题出在哪里,所以我希望你能给我一些建议。我们的应用程序使用Postgres、Hibernate、JPA和Spring,我们使用BoneCP来设置数据源。我在@Transaction注释中没有设置任何超时,我看到的行为似乎并不表示spring超时

    一些BoneCP设置:

     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();
        }