[英]Migrate Spring application to Spring Boot with Spring Data JPA and Hibernate
[英]Hibernate sessions management in Spring Boot JPA application with HikariCP data source
在带有HikariCP数据源的Spring Boot应用程序中,我已经使用帮助程序类执行了HQL查询:
public class QueryExecutor {
private Session session;
@Autowired
private SessionFactory sessionFactory;
public QueryExecutor getConnection() {
session = sessionFactory.openSession();
session.beginTransaction();
return this;
}
public void closeConnection() {
session.getTransaction().commit();
session.close();
}
public List execute(String hql, Long limit, Long offset) {
getConnection();
Query query = session.createQuery(hql);
List list = query.list();
closeConnection();
return list;
}
它可以正常工作,但是当我开始广泛使用类时,应用程序启动会冻结,因为Hibernate Session随机关闭,并且事务在get Session关闭之前等待30秒(HikariCP事务的默认超时值)(如果我使用getCurrentSession(,currentPersistenceContext为null) ),而不是openSesssion()。
首先,我将打开的会话更改为getCurrentSession函数。 但是我还需要在hibernate.cfg.xml中使用@PersistenceContext或hibernate.current_session_context_class = thread指定上下文。 我读到该属性最好与默认值一起使用。 我也指定hibernate.connection.release_mode = AFTER_TRANSACTION。 但这并不能解决问题。
毕竟,我像这样改变了班级:
@PersistenceContext
private EntityManager entityManager;
@Transactional
public List execute(String hql, Long limit, Long offset) {
Query query = entityManager.createQuery(hql);
return query.getResultList();
}
并使用javax.persistence.Query代替Hibernate查询。 现在可以了。 但这是正确的修改吗? 使用QueryExecutor的execute方法(以@Transactional注释)的所有函数。 如我所见,在这种情况下,无需beginTransaction()。 但是需要在execute()之后关闭entityManager吗?
在没有JPA的情况下与Hibernate一起使用的SessionFactory和与Hibernate JPA技术一起使用的EntityManager?
不使用EntityManager怎么解决问题?
如果使用@Transactional
批注,则无需手动关闭事务。
但是,如果您使用它,我建议您尝试使用JPA存储库,并将@Transactional
批注仅包装业务逻辑方法。
在这种情况下,您将不再需要EntityManager
并且可以使用JpaSpecificationExecutor和JPA Criteria API Queries创建自定义复杂查询 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.