gpt4 book ai didi

jpa - 如何为 Spring Data JPA 存储库管理数据库连接?

转载 作者:行者123 更新时间:2023-12-04 15:27:58 26 4
gpt4 key购买 nike

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

谁处理数据库连接? @Transactional注释或 JPA 存储库?

最佳答案

tl;博士
最终是 Spring JPA/Transaction 基础设施通过 EntityManager 的 thead-bound 管理来管理连接。实例。交易范围由@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因此很早就获得了一个连接,并保持它直到请求处理的很晚,即在 View 呈现之后。这具有 JPA 延迟加载可用于 View 渲染的效果,但保持连接打开的时间比仅用于实际事务工作所需的时间更长。
那个话题挺有意思的 controversial one因为它在开发人员的便利性(在 View 渲染阶段遍历对象关系以延迟加载的能力)之间的微妙平衡,风险正是触发昂贵的额外查询和保持资源使用更长时间。

关于jpa - 如何为 Spring Data JPA 存储库管理数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52084659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com