Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

连接池poolingCount为0并且failContinuous为true时 直接createPhysicalConnection导致createError被清空,CreateConnectionTask无法继续创建连接 #2741

Open
tankilo opened this issue Aug 5, 2018 · 2 comments

Comments

@tankilo
Copy link

tankilo commented Aug 5, 2018

弄了个工程来复现这个问题 https://github.com/tankilo/druidbug1

生产环境问题现象
mysql连接数满了,导致应用无法创建物理连接,但是mysql恢复以后发现有一个连接池仍然无法继续创建物理连接,并且没有create connection报错,dump显示poolingCount为0,failContinuous为true,createError为null,lastCreateError在一天前,但是连到这个mysql的其他druid连接池可以创建连接。
业务线程获取链接报错 也一直为

com.alibaba.druid.pool.DataSourceNotAvailableException: null
	at com.alibaba.druid.pool.DruidDataSource.pollLast(DruidDataSource.java:1931)
	at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1458)
	at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1255)
	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1235)

分析
下面是一些猜测,因为出问题后因为一些限制,没法获取很多信息,只是发现这种猜想是可以导致这个问题发生。
在mysql连接数缓解一些后,应用代码里直接调用连接池的createPhysicalConnection来获取物理连接,这里会把createError清空。
poolingCount 一直为0,notEmptyWaitThreadCount因为业务线程获取连接时在failContinuous那行提前报DataSourceNotAvailableException 也一直为0

if (failFast && failContinuous.get()) {
                    throw new DataSourceNotAvailableException(createError);
                }

CreateConnectionTask运行的时候在下面return,导致连接池无法创建出连接。

if (createError != null && poolingCount == 0) {
                        emptyWait = false;
                    }

                    if (emptyWait) {
                        // 必须存在线程等待,才创建连接
                        if (poolingCount >= notEmptyWaitThreadCount //
                                && !(keepAlive && activeCount + poolingCount < minIdle)
                                && !initTask) {
                            createTaskCount--;
                            return;
                        }

从语义上来说如果连接池能直接创建出物理连接,失败就没有继续了,failContinuous应该为false。请确认。

@zhangdc007
Copy link

这个有什么办法规避么

@tankilo
Copy link
Author

tankilo commented Jul 9, 2021

这个有什么办法规避么

都很久以前的问题了,当时我是稳定复现这个问题的,提了官方也没回复确认。我不确认现在的版本是不是还会出这个问题。过了太久了。

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants