【问题标题】:How do database connections get managed for Spring Data JPA repositories?如何为 Spring Data JPA 存储库管理数据库连接?
【发布时间】:2019-02-04 16:02:49
【问题描述】:

我有一个关于 Spring Data 存储库如何处理数据源连接的问题。假设 Spring Data 存储库在方法执行时打开和关闭连接以及连接,那么通过在我的服务层中声明 @Transactional 来启动事务如何跨越多个存储库调用?

谁处理数据库连接? @Transactional 注解还是 JPA 存储库?

【问题讨论】:

    标签: jpa transactions spring-data-jpa spring-data


    【解决方案1】:

    tl;博士

    最终是 Spring JPA / Transaction 基础架构通过EntityManager 实例的绑定管理来管理连接。事务的范围由用户代码中的@Transactional 注释控制,但最终默认在 Spring Data JPA 的存储库实现中。如果使用OpenEntityManagerInViewFilter(在 Spring Boot 1.x 和 2.x 中默认启用),则会急切地执行连接获取。

    详情

    SimpleJpaRepository 配备了 Spring 的 @Transactional 注释,以便它确保在 JPA 需要它们的情况下运行事务(例如,执行对 EntityManager.persist(…)….merge(…) 的调用)。它们的默认配置确保它们自动参与以更高抽象级别开始的事务。 IE。如果你有一个 @Transactional 本身的 Spring 组件,存储库将简单地参与已经运行的事务:

    @Component
    class MyService {
    
      private final FirstRepository first;
      private final SecondRepository second;
    
      // Constructor omitted for brevity
    
      @Transactional
      void someMethod() {
    
         … = first.save(…);
         … = second.save(…);
      }
    }
    

    两个存储库都参与事务,其中一个存储库出现故障将回滚整个事务。

    为此,JpaTransactionManager 将使用 JPA 的 EntityManager 公开的事务管理 API 来启动事务并在 EntityManager 实例的生命周期内获取连接。详情请见JpaTransactionManager.doBegin(…)

    OpenEntityManagerInViewFilter–Interceptor 的角色

    除非显式停用,否则 Spring Boot 1.x 和 2.x Web 应用程序会在部署 OpenEntityManagerInViewFilter 的情况下运行。它用于创建一个EntityManager,因此很早就获得了一个连接并保持它直到请求处理的很晚,即在视图被渲染之后。这具有 JPA 延迟加载可用于视图呈现的效果,但保持连接打开的时间比仅用于实际事务工作的时间长。

    该主题是一个 controversial one,因为它在开发人员便利性(遍历对象关系以在视图渲染阶段延迟加载的能力)之间进行了一个棘手的平衡,这可能会触发昂贵的额外查询并保留资源使用更长时间。

    【讨论】:

    • 嗨奥利弗,感谢您的解释。所以即使响应是 Json/Xml 格式,OpenEntityManagerInViewFilter 对延迟加载也是有效的,对吗?
    • 我同意我不应该使用实体进行响应转换
    • 大多数时候,响应是根据某些实体状态呈现的,例如该实体可能只是被转发给杰克逊进行 JSON 编组。在这些情况下,您必须确保关联在渲染过程中是可遍历的。
    • 如果使用 Jpa 实体,所有惰性集合都会在 json 序列化期间初始化,是否不会影响服务延迟?
    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2021-01-28
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多