我有线程系统。 7000线程处理一些复杂的任务。
我们有java解决方案:spring,hibernate for persistence,log4j2,hikari连接池用于db访问(用bean加载和管理)
我之前设置了Hikari连接池大小%30的线程大小。但我们得到了这个 连接不可用,请求在30025ms后超时...... 错误。在此错误后,我无法修复服务停止。我尝试将db pool size增加到8000。
因此线程大小为:7000,db pool size为:8000 ..
但即时通讯让这个错误出乎意料。发生了什么?有人可以解释为什么数据库连接不会启用此服务吗?
我读过大多数用户使用最小池大小示例20.000线程运行其服务但只有20 db池大小。怎么办?你能解释一下,我的服务设计问题是什么。
是的,我有@Transactional
注释,并且在复杂的拍摄中需要很多功能。这有问题吗?点是这个吗?
你能帮我找到主要问题是什么吗?
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC
Connection at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:431)
Caused by: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
Caused by: java.sql.SQLTransientConnectionException: springHikariCP - Connection is not available, request timed out after 30025ms.
Caused by: java.sql.SQLException: Network error IOException: Address already in use: connect
Caused by: java.net.BindException: Address already in use: connect
答案 0 :(得分:0)
仅仅因为您允许程序使用数千个同时连接到数据库,并不意味着数据库可以处理它们。这就是为什么在一段时间后(在几十个或几百个连接中)增加连接会产生反效果。
您可以配置等待免费连接的超时(在您的示例中为30秒),但它不会改变这样一个事实:如果您尝试在规模较小的服务器上做很多事情,那么您将会陷入困境。
获取更大的数据库(或扩展),使用更少的线程或尝试在数据库中查找可以优化的性能热点。