@Procedure 注释孤立数据库连接 (spring-data-jpa)

@Procedure annotation orphaning database connections (spring-data-jpa)

我们在生产中有一个批处理作业调用存储过程来更新一些表。这个存储过程没有 return 任何东西。现在,我们 运行 没有数据库连接,因为每次作业 运行 时都会有 1 个连接被孤立。存储库使用带有过程注释的 Spring Data CrudRepository。

我们是否遗漏了有关调用和 spring 数据 jpa 的内容?提前致谢!

@Repository
public interface CertificationRepository extends CrudRepository<Certification,     Integer> {
    @Procedure("usp_batch_update_certifications")
    void updateCertifications(Date previousFireTime);
}

您使用哪个 Spring-Data-JPA 版本和哪个 PersistenceProvider? 您能否指出一个重现该问题的精简示例应用程序?

如评论中所述,我可以重现您的问题。 程序执行需要一个 TX,该 TX 要么不存在,要么周围的 TX 从未提交。

您可以尝试添加过程方法@Transactional

角色实体:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.StoredProcedureParameter;

/**
 * Oracle PL/SQL
 *
 * <pre>
 *  CREATE or replace PROCEDURE update_roles (pattern_i IN varchar) AS
 *  BEGIN 
 *    DBMS_OUTPUT.put_line('update_roles Received pattern: ' || pattern_i);
 *  END;
 * /
 * 
 * <pre>
 */
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "Role.updateRoles"
                         , procedureName = "update_roles"
                         , parameters = { 
                            @StoredProcedureParameter(name = "pattern"
                                                    , mode = ParameterMode.IN
                                                    , type = String.class) })
})
@Entity
public class Role {

    @Id @GeneratedValue//
    private Long id;

    private String name;
    ...

角色存储库:

import java.io.Serializable;

import javax.transaction.Transactional;

import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

interface RoleRepository extends CrudRepository<Role, Serializable> {

    @Procedure
    @Transactional
    void updateRoles(@Param("pattern") String pattern);
}