spring 启动和休眠 5 - EntityManagerFactory 会话管理
spring boot and hibernate 5 - EntityManagerFactory session management
我正在使用 Spring-boot 和休眠开发我的第一个网络应用程序。
我的第一个 DAO 是这样写的:
package myapplication.orderinfo;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManagerFactory;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
@Component
public class OrderInfoDaoImpl implements OrderInfoDao {
@Autowired
private EntityManagerFactory entityManagerFactory;
public List<OrderInfo> getOrderInfoDetails() {
Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery criteria = builder.createQuery(OrderInfo.class);
Root contactRoot = criteria.from(OrderInfo.class);
criteria.select(contactRoot);
return session.createQuery(criteria).getResultList();
}
public List<OrderInfo> getOrderInfo(String typeName) {
Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery criteria = builder.createQuery(OrderInfo.class);
Root contactRoot = criteria.from(OrderInfo.class);
criteria.where(builder.equal(contactRoot.get("typeName"), typeName));
return session.createQuery(criteria).getResultList();
}
}
像这样在每个方法中调用entityManagerFactory是否正确?
我读过一些这方面的文章,我了解到会话在每次查询结束时被工具关闭,这是正确的吗?
启动时一切看起来都很好,但在应用程序中进行了几次查询后,我遇到了这种崩溃:
Hibernate: select distinct orderinfo0_.projectLeader as col_0_0_ from t_orderInfo orderinfo0_
2018-11-12 15:12:11.746 WARN 11360 --- [nio-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: null
2018-11-12 15:12:11.747 ERROR 11360 --- [nio-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper : HikariPool-1 - Connection is not available, request timed out after 30000ms.
2018-11-12 15:12:11.752 ERROR 11360 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection] with root cause
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:669) ~[HikariCP-2.7.9.jar:na]
我想知道这是否来自我对 Hibernate 会话的实现/使用。
任何帮助将不胜感激:o)
谢谢
原因是您没有关闭会话。另外,更好的是,正确处理事务。
如果你想手动处理会话和交易,你可以检查这个方法
可能您需要阅读 Spring @Transactional
注释和 Spring 数据,如果您还没有阅读的话。
我正在使用 Spring-boot 和休眠开发我的第一个网络应用程序。
我的第一个 DAO 是这样写的:
package myapplication.orderinfo;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManagerFactory;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
@Component
public class OrderInfoDaoImpl implements OrderInfoDao {
@Autowired
private EntityManagerFactory entityManagerFactory;
public List<OrderInfo> getOrderInfoDetails() {
Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery criteria = builder.createQuery(OrderInfo.class);
Root contactRoot = criteria.from(OrderInfo.class);
criteria.select(contactRoot);
return session.createQuery(criteria).getResultList();
}
public List<OrderInfo> getOrderInfo(String typeName) {
Session session = entityManagerFactory.unwrap(SessionFactory.class).openSession();
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery criteria = builder.createQuery(OrderInfo.class);
Root contactRoot = criteria.from(OrderInfo.class);
criteria.where(builder.equal(contactRoot.get("typeName"), typeName));
return session.createQuery(criteria).getResultList();
}
}
像这样在每个方法中调用entityManagerFactory是否正确? 我读过一些这方面的文章,我了解到会话在每次查询结束时被工具关闭,这是正确的吗?
启动时一切看起来都很好,但在应用程序中进行了几次查询后,我遇到了这种崩溃:
Hibernate: select distinct orderinfo0_.projectLeader as col_0_0_ from t_orderInfo orderinfo0_
2018-11-12 15:12:11.746 WARN 11360 --- [nio-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 0, SQLState: null
2018-11-12 15:12:11.747 ERROR 11360 --- [nio-8080-exec-7] o.h.engine.jdbc.spi.SqlExceptionHelper : HikariPool-1 - Connection is not available, request timed out after 30000ms.
2018-11-12 15:12:11.752 ERROR 11360 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection] with root cause
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:669) ~[HikariCP-2.7.9.jar:na]
我想知道这是否来自我对 Hibernate 会话的实现/使用。
任何帮助将不胜感激:o) 谢谢
原因是您没有关闭会话。另外,更好的是,正确处理事务。
如果你想手动处理会话和交易,你可以检查这个方法
可能您需要阅读 Spring @Transactional
注释和 Spring 数据,如果您还没有阅读的话。