繁体   English   中英

使用HikariCP数据源的Spring Boot JPA应用程序中的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并且可以使用JpaSpecificationExecutorJPA Criteria API Queries创建自定义复杂查询

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM