gpt4 book ai didi

java - 如何使用Hibernate释放连接?

转载 作者:行者123 更新时间:2023-12-02 09:42:57 32 4
gpt4 key购买 nike

在我的网络应用程序中发出一些请求后,我得到了这个异常:

java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30002ms.

需要明确的是,我没有配置连接池(Hikari)。application.properties中有我的所有属性:

spring.datasource.url=jdbc:postgresql://localhost/authHibernate
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.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 exceptions
logging.level.org.springframework.security=DEBUG
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.hibernate.type=TRACE

我的目标是在我的 Spring-Boot 应用程序中使用常用的 Hiberante(对于所有这些 JpaRepo<> 和 CrudRepo 来说,这不是一个简单的 Spring Data 方式)。我为此从 EntityManager 获得了 session ,并像平常的 Hibernate 一样使用它。据我了解,数据源负责连接池。但这个东西就是 JDBC 的东西。我应该如何使用 Hibernate 方式而不是 JDBC 方式修复连接池?我的 Dao 类(class)之一:

@Component
public class GrowBoxDaoImpl implements GrowBoxDao {

@Autowired
private EntityManagerFactory entityManagerFactory;

@Override
public 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;
}

@Override
public GrowBox findById(Long id) {

Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
GrowBox growBox = session.get(GrowBox.class, id);
session.close();

return growBox;
}

@Override
public GrowBox saveBox(GrowBox box) {
Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
session.getTransaction().begin();
session.saveOrUpdate(box);
session.flush();
session.getTransaction().commit(); // call flush too
session.close();
return box;
}

@Override
public void deleteBox(Long id) {

String hqlQuery = "delete GrowBox where id =: id";
Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
session.getTransaction().begin();

session.createQuery(hqlQuery).setParameter("id", id).executeUpdate();
session.flush();
session.getTransaction().commit();
session.close();
}
}

我有一些实体以及每个实体的 Dao 类和服务。还有一些使用我的服务的 Controller 。如果有帮助的话,这里有我的应用程序的 Git Repo:https://github.com/DennisKingsman/HibernateWithSpringBootExample

最佳答案

在典型的带有 Spring-boot 的 Hibernate 情况下,您可以只包含

@PersistenceUnit
private EntitiyManager entityManager;

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

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

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

关于java - 如何使用Hibernate释放连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56914064/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com