簡體   English   中英

Spring Boot和Hibernate 5-EntityManagerFactory會話管理

[英]spring boot and hibernate 5 - EntityManagerFactory session management

我正在使用Spring-boot和Hibernate開發第一個Web應用程序。

我已經這樣寫了我的第一個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)謝謝

原因是您沒有關閉會話。 此外,更好地,以正確地處理事務。

如果您想手動處理會話和傳譯,可以檢查此方法https://stackoverflow.com/a/36278975/3405171

如果您尚未閱讀Spring @Transactional批注和Spring Data,則可能需要閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM