Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring启动-数据源不返回已使用的连接_Java_Postgresql_Hibernate_Spring Boot_Hikaricp - Fatal编程技术网

Java spring启动-数据源不返回已使用的连接

Java spring启动-数据源不返回已使用的连接,java,postgresql,hibernate,spring-boot,hikaricp,Java,Postgresql,Hibernate,Spring Boot,Hikaricp,我在PostgreSQL上使用带hibernate的spring boot DB:PostgreSQL版本:9.6.8 SPRING启动版本: 我的问题: 两次请求GET调用后,无法从中使用连接 池(或新池) 有人能指出哪里出了问题吗? 所以抛出下面的异常 java.sql.SQLTransientConnectionException: SpringBootJPAHikariCP - Connection is not available, request timed out aft

我在PostgreSQL上使用带hibernate的spring boot

DB:PostgreSQL版本:9.6.8

SPRING启动版本:

我的问题:

两次请求GET调用后,无法从中使用连接 池(或新池)

有人能指出哪里出了问题吗? 所以抛出下面的异常

    java.sql.SQLTransientConnectionException: SpringBootJPAHikariCP - Connection is not available, request timed out after 3000ms.
        at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:667) ~[HikariCP-2.7.8.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:183) ~[HikariCP-2.7.8.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:148) ~[HikariCP-2.7.8.jar:na]
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128) ~[HikariCP-2.7.8.jar:na]
        at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
    at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:48) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
Caused by: java.sql.SQLTransientConnectionException: SpringBootJPAHikariCP - Connection is not available, request timed out after 3000ms.
    at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:667) ~[HikariCP-2.7.8.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:183) ~[HikariCP-2.7.8.jar:na]
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:148) ~[HikariCP-2.7.8.jar:na]
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128) ~[HikariCP-2.7.8.jar:na]
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
我已设置以下连接池属性

    spring.datasource.hikari.minimumIdle=250
spring.datasource.hikari.maximumPoolSize=5
spring.datasource.hikari.idleTimeout=3000
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.hikari.maxLifetime=500
spring.datasource.hikari.connectionTimeout=3000
DAO类:

    @Component
public class NickNameDAO {


    @Autowired
    private EntityManagerFactory entityManagerFactory;
    
    
    @Transactional
    public List<NickName> getUserDetails() {
        
        
        
        SessionFactory session = AutoWiringUtils.getSessionFactory(entityManagerFactory);
        
        Criteria criteria = session.openSession().createCriteria(NickName.class);
        List<NickName> returnValues = criteria.list();
        return returnValues;
    }
    
    
}
更新:1

使用
session.getCurrentSession
时,我面临以下异常

@Component
public class NickNameDAO {
    @Autowired
    private EntityManagerFactory entityManagerFactory;
    
    @Transactional
    public List<NickName> getUserDetails() {
        SessionFactory session = AutoWiringUtils.getSessionFactory(entityManagerFactory);
        Criteria criteria = session.getCurrentSession().createCriteria(NickName.class);
        List<NickName> returnValues = criteria.list();
        return returnValues;
    }
}
javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl.java:3466) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1426) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1422) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.springframework.orm.hibernate5.SessionFactoryUtils.flush(SessionFactoryUtils.java:147) ~[spring-orm-5.0.5.RELEASE.jar:5.0.5.RELEASE]
@组件
公共类别名{
@自动连线
私人实体管理工厂实体管理工厂;
@交易的
公共列表getUserDetails(){

SessionFactory session=AutoWiringUtils.getSessionFactory(entityManagerFactory); Criteria=session.getCurrentSession().createCriteria(昵称.class); List returnValues=criteria.List(); 返回值; } } javax.persistence.TransactionRequiredException:没有正在进行的事务 在org.hibernate.internal.SessionImpl.checkTransactionRequired(SessionImpl.java:3466)~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] 在org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1426)~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] 在org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1422)~[hibernate-core-5.2.16.Final.jar:5.2.16.Final] 在org.springframework.orm.hibernate5.SessionFactoryUtils.flush(SessionFactoryUtils.java:147)~[spring-orm-5.0.5.RELEASE.jar:5.0.5.RELEASE]
真是一团糟!您正在使用@Transactional注释打开entityManager的事务,然后打开打开entityManager工厂的会话!只需选择一个就可以了。如果您想使用标准,只需删除@Transactional(即spring数据jpa),根本不创建实体管理器(jpa),只需从emfok中打开会话(特定于hibernate),那么您可以帮助如何在不创建实体管理器的情况下获取SessionFactory.SessionFactory Session=AutoWiringUtils.getSessionFactory吗(entityManagerFactory);很好,只是不要获取EntityManager或使用它开始TrasAction em.getTransaction().begin(),这表示您的配置中缺少设置。但是为什么您首先要使用普通的Hibernate API。而只需使用普通的JPA即可。
@Service
public class NickNameService {
    
    @Autowired
    private NickNameDAO nickNameDAO;
    
    public  List<NickName> getUserDetails() {
        return nickNameDAO.getUserDetails();

    }

}
public class AutoWiringUtils {
    public static SessionFactory getSessionFactory(EntityManagerFactory entityManagerFactory) {
        
        
         
        if (entityManagerFactory.unwrap(SessionFactory.class) == null) {
            throw new NullPointerException("factory is not a hibernate factory");
        }
        return entityManagerFactory.unwrap(SessionFactory.class);
    }

}
@Component
public class NickNameDAO {
    @Autowired
    private EntityManagerFactory entityManagerFactory;
    
    @Transactional
    public List<NickName> getUserDetails() {
        SessionFactory session = AutoWiringUtils.getSessionFactory(entityManagerFactory);
        Criteria criteria = session.getCurrentSession().createCriteria(NickName.class);
        List<NickName> returnValues = criteria.list();
        return returnValues;
    }
}
javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl.java:3466) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1426) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1422) ~[hibernate-core-5.2.16.Final.jar:5.2.16.Final]
    at org.springframework.orm.hibernate5.SessionFactoryUtils.flush(SessionFactoryUtils.java:147) ~[spring-orm-5.0.5.RELEASE.jar:5.0.5.RELEASE]