java - spring boot - 数据源不返回使用的连接
问题描述
我在 PostgreSQL 上使用带有休眠功能的 Spring Boot。
数据库:PostgreSQL 版本:9.6.8
弹簧启动版本:
我的问题:
在两次请求 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;
}
}
控制器类:
public class MainController {
@GetMapping(path="/all")
public @ResponseBody Iterable<NickName> getAllUsers() {
// This returns a JSON or XML with the users
return nickNameService.getUserDetails();
}
}
服务等级:
@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);
}
}
更新: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]
解决方案
推荐阅读
- c# - 如何在 Azure FunctionApp 中使用 Microsoft.Extensions.Logging.ILogger 作为类变量?
- node.js - AMQPLIB - NodeJS - 在 RabbitMQ 中断言一个惰性队列
- python - Jupyter Notebook 的终端命令未使用正确的 conda 环境
- javascript - 用户登录网站后如何显示空白页面?
- python - python 是否可以从现有数据框创建新数据框?
- java - 如何使用 azure Java Storage SDK V10 获取 blob Uri
- plugins - 如何自动删除结束标签
- serverless-framework - Void 处理程序的本地无服务器调用 - InvokeBridge 异常
- python - on_reaction_add 自定义表情符号
- javascript - TypeError:无法读取 null 的属性“值”| 反应js |