2015-01-20 102 views
0

我们在生产中调用存储过程来更新某些表的批处理作业。这个存储过程不会返回任何东西。目前,我们正在耗尽数据库连接,因为每次作业运行时,1个连接都会成为孤儿。存储库使用Spring Data CrudRepository和过程注释。@Procedure注释孤儿数据库连接(spring-data-jpa)

我们是否错过了关于调用和弹簧数据jpa的东西?提前致谢!

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

我创建https://jira.spring.io/browse/DATAJPA-663来调查这一点。 – 2015-01-21 08:20:36

回答

5

哪个Spring-Data-JPA版本和您使用哪个PersistenceProvider? 你能指点我一个简化的示例应用程序,重现问题?

正如评论中所说,我可以重现你的问题。 程序执行需要一个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); 
} 
+0

我可以在一个小样本应用程序中重现问题。看起来该过程被调用的上下文中的TX不提交。 – 2015-01-21 09:36:30

+0

你可以尝试的一个简单的解决方法是用@Transactional手动标记updateCertifications(..)方法。 – 2015-01-21 09:37:17

+0

谢谢托马斯!我曾尝试在服务层添加事务注释。像你所建议的那样将它添加到存储库已经解决了这个问题。再次感谢! – 2015-01-21 15:29:06