我在SpringMVC应用程序中使用hibernate JPA。我用这段代码初始化它
@PersistenceContext
protected EntityManager entityManager;
现在这个entityManager将在我的应用程序的整个生命周期中存活。 hibernate的实现 EntityManager正在包装一个休眠会话。如果你愿意,你可以打开它。当我们在没有JPA的情况下使用纯hibernate时。我们打开会话做我们的工作并关闭会话。如果EntityManager在打开时和关闭时在幕后使用hibernate会话。如果它在应用程序的整个生命周期中保持单个会话,那么它不会产生问题,因为实体不会被自动驱逐吗?它可能导致内存不足错误?
答案 0 :(得分:0)
我会尝试回答每个问题(根据我的经验和期望),但我很确定这取决于您是使用JTA交易还是使用UserTransactions(a.k.a资源本地交易):
如果EntityManager在打开时和关闭时在后台使用hibernate的会话?
对于EntityManager的每个实例,都会打开一个新的hibernate会话。如果使用JTA事务,则在事务关闭时(第一个服务bean方法返回时),entityManager将关闭。
如果它在整个生命周期中保持单个会话不会 它会产生问题,因为实体不会被自动驱逐?它 可能导致内存不足错误?
它没有保持单个休眠会话。如果你配置了它,它将有一个可重用连接池,但对于每个新创建的bean,它将生成一个新的实体管理器,后面有一个新的Hibernate会话。