2015-01-20 59 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