【问题标题】:@Procedure annotation orphaning database connections (spring-data-jpa)@Procedure 注解孤立数据库连接(spring-data-jpa)
【发布时间】:2015-03-19 05:17:31
【问题描述】:

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

我们是否遗漏了有关呼叫和弹簧数据 jpa 的某些内容?提前致谢!

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

【问题讨论】:

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


【解决方案1】:

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

正如 cmets 中所说,我可以重现您的问题。 过程执行需要一个不存在的 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);
}

【讨论】:

  • 我可以在一个小示例应用程序中重现该问题。似乎调用过程的上下文中的 TX 没有提交。
  • 您可以尝试的一个简单修复方法是使用 @Transactional 手动标记 updateCertifications(..) 方法。
  • 谢谢你,托马斯!我曾尝试在服务层添加事务注释。像你建议的那样将它添加到存储库中已经解决了这个问题。再次感谢!
  • 我终于得到了这个解决方案。谢谢。
猜你喜欢
  • 2016-12-02
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2019-02-04
  • 1970-01-01
  • 2015-02-11
  • 2017-08-10
相关资源
最近更新 更多