为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Hibernate 释放连接?

如何使用 Hibernate 释放连接?

开满天机 2023-03-09 15:00:40
在我的网络应用程序中发出一些请求后,我得到了这个异常:java.sql.SQLTransientConnectionException: HikariPool-1 - 连接不可用,请求在 30002 毫秒后超时。明确地说,我没有配置连接池(Hikari)。application.properties 中有我所有的属性:spring.datasource.url=jdbc:postgresql://localhost/authHibernatespring.datasource.username=postgresspring.datasource.password=postgresspring.jpa.show-sql=truespring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialectspring.datasource.driver-class-name=org.postgresql.Driver Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented.spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false  for exceptionslogging.level.org.springframework.security=DEBUGlogging.level.org.hibernate.SQL=DEBUGlogging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACElogging.level.org.hibernate.type=TRACE我的目标是在我的 Spring-Boot 应用程序中使用通常的 Hiberante(所有这些 JpaRepo<> 和 CrudRepo 不是一个简单的 Spring Data 方式)。为此,我从 EntityManager 获得了会话,并像在通常的 Hibernate 中一样使用它。据我了解,数据源负责连接池。但是这个东西是JDBC的东西。我应该如何用 Hibernate 方式而不是 JDBC 方式修复我的连接池?有一个我的 Dao 类:@Componentpublic class GrowBoxDaoImpl implements GrowBoxDao {@Autowiredprivate EntityManagerFactory entityManagerFactory;@Overridepublic List<GrowBox> findByUser(Long userId) {    Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();    String hqlQuery = "from GrowBox gb where gb.responsibleUser.id =: userId";    Query query = session.createQuery(hqlQuery);    query.setParameter("userId", userId);    List growBoxes = query.getResultList();    session.close();    return growBoxes;}@Overridepublic GrowBox findById(Long id) {    Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();    GrowBox growBox = session.get(GrowBox.class, id);    session.close();    return growBox;}}}我有几个实体和每个实体的 Dao 类和服务。还有一些使用我的服务的控制器。如果有帮助,我的应用程序有 Git Repo: https: //github.com/DennisKingsman/HibernateWithSpringBootExample
查看完整描述

1 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

在典型的 Hibernate with Spring-boot 案例中,您可以只包括

@PersistenceUnit
private EntitiyManager entityManager;

spring-boot 负责EntityManager自动创建 s。它还会自动保留一个 EntityManagerFactory。无需显式使用EntityManagerFactory. 这称为容器管理的事务。会话自动关闭。

EntityManager 作为ThreadLocal(由 Spring-boot)管理,因此您可能无法访问另一个线程中的同一个。

另一种方法是使用应用程序管理的事务。阅读https://docs.oracle.com/cd/E19798-01/821-1841/bnbra/index.html


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信