Pur*_*mar 3 spring jpa spring-mvc spring-data-jpa spring-boot
这是一个非常基本的问题,但我需要帮助。假设我们在 spring 中创建了一个单例 bean,那么 spring ioc 将创建该特定 bean 的单个实例,并且当某种代码需要它时会注入它。那很好。但是我对多线程环境将如何管理它感到困惑。就像我们在 spring 中创建一个 sesssionFactory bean 作为单例,然后向需要 sessionFactory bean 的特定 rest url 发出许多请求。spring 框架如何为这么多请求提供单个 bean 实例。
您是在谈论持久性提供程序会话工厂,例如Hibernate SessionFactory吗?
这个工厂应该为每个 DataSource 存在一次,因为它的创建成本(连接处理、内存消耗)并不便宜,而且绝对应该在整个应用程序生命周期中重用,所以此时单例是要走的路。工厂是不可变的(线程安全的),不会有并发问题。
每个传入线程(由 Web 请求创建)都应该重用这个工厂来创建它自己的会话,并且这个会话应该用于这个线程,无论它被访问的频率如何(例如存储在线程局部变量中)。
例如,如果我们现在在抽象层中向上移动到 JPA 级别,JPA EntityManagerFactory正在包装 Hibernate SessionFactory,并且如果您想将 JPA 挂件用于 Hibernate 会话 - EntityManager - 并且您希望让 Spring 管理它,您会得到一个这样的 EntityManager 代理:
@PersistenceContext
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)
这将为您的业务代码提供当前线程的 EntityManager 代理(包装会话)。
如果您使用Spring Data JPA,它是存储库和@Transactional方法,那么同样适用于下一个抽象级别。在这种情况下,Spring 也会为您处理。
| 归档时间: |
|
| 查看次数: |
546 次 |
| 最近记录: |