@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);
}
我们在生产中有一个批处理作业调用存储过程来更新一些表。这个存储过程没有 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);
}