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

时间:2015-01-20 20:23:43

标签: hibernate spring-data spring-data-jpa

我们在生产中有一个批处理作业,它调用存储过程来更新某些表。此存储过程不会返回任何内容。现在,我们正在耗尽数据库连接,因为每次运行作业时,1个连接都会孤立。存储库使用Spring Data CrudRepository和过程注释。

我们是否遗漏了有关通话和弹簧数据jpa的内容?提前谢谢!

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

1 个答案:

答案 0 :(得分:8)

您使用的是哪个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;
    ...

RoleRepository:

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