-
Notifications
You must be signed in to change notification settings - Fork 401
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
dynamic-datasource如果之前数据库连接错误,无法关闭,直至达到最大重试次数。 #19
Comments
我理解你的意思,不过我本地貌似无法复现这个场景,你能提供一个可以复现的步骤吗?
|
我的程序中ORM用的是Mybatis,在Apollo中配置错误的url,启动程序,会在建立mysql连接时报错,生成空的datasource,Mybatis生成空的sqlSessionFactory和sqlSessionTemplate,但程序不会停止,然后在Apollo中更改正确的配置,就出现了上述场景。 我试了下你提供的实例,启动错误的url,建立mysql连接时报错,会在hibernate处报错并退出。 |
这个应该和mybatis没啥关系,和datasource的创建逻辑有关,如果连接失败的话,datasource应该创建失败,可以看下你这边空的datasource是怎么出现的? |
@nobodyiam @coreyho 日志如下
重现步骤: 一开始 apollo 配置的 账户密码是错误的。无法正常建立MySQL连接。 后面 改成正确的正确密码,后发现旧数据源 poolMXBean is null 因没正确的建立连接池。 无法关闭。一直重试。 /**
* 优雅的终止 HikariCP线程池
*
* @see <a href="https://github.com/brettwooldridge/HikariCP/issues/742">Support graceful shutdown of connection
* pool</a>
*/
private boolean terminateHikariDataSource(HikariDataSource dataSource) {
HikariPoolMXBean poolMXBean = dataSource.getHikariPoolMXBean();
// 增加判断
if (Objects.isNull(poolMXBean)) {
dataSource.close();
return true;
}
//evict idle connections
poolMXBean.softEvictConnections();
if (poolMXBean.getActiveConnections() > 0 && retryTimes < MAX_RETRY_TIMES) {
logger.warn("Data source {} still has {} active connections, will retry in {} ms.", dataSource,
poolMXBean.getActiveConnections(), RETRY_DELAY_IN_MILLISECONDS);
return false;
}
if (poolMXBean.getActiveConnections() > 0) {
logger.warn("Retry times({}) >= {}, force closing data source {}, with {} active connections!", retryTimes,
MAX_RETRY_TIMES, dataSource, poolMXBean.getActiveConnections());
}
dataSource.close();
return true;
} 增加
这样正常的关闭了。 |
如果出现数据库连接错误,比如
url
写错了,会实例化一个HikariDataSource(null)
,在重新配置新数据库设置后,将关闭上一个连接,进入terminateHikariDataSource()
方法,执行poolMXBean.softEvictConnections()
时抛会异常,致使不断循环直到达到最大重试次数,在terminate()
方法中的if (dataSource instanceof HikariDataSource )
添加一个非空检查可以避免不断重试。The text was updated successfully, but these errors were encountered: