druid1.2.8源码悦读:第四天
文章目录
一、回顾getConnection()
中的init()
在init()中,完成了三个动作:
- 加载数据库驱动;
- 创建了一个用于创建数据库连接的线程:
createConnectionThread
; - 创建了一个用于销毁数据库连接的线程:
destroyConnectionThread
二、创建Connection
:DruidPooledConnection
2.1 如果有filter,根据FilterChainImpl创建连接池
通过filter列表创建连接池:
- 创建
FilterChainImpl
的时候,初始化pos为0
// 这里的this 是 DataSource
FilterChainImpl filterChain = new FilterChainImpl(this);
DruidPooledConnection connection = filterChain.dataSource_connect(this, maxWaitMillis);
-
递归调用
List<Filter> filters
是在DataSource中创建出来的// 这里的this 是 FilterChainImpl filters.get(pos++).dataSource_getConnection(this, dataSoruce, maxWaitMillis);
-
dataSource_getConnection
可以看到这句话,进行了递归调用
DruidPooledConnection conn = chain.dataSource_connect(dataSource, maxWaitMillis);
可以看出穿过过滤器,最先调用的代码,又回到了:
dataSource.getConnectionDirect(maxWaitMillis);