druid1.2.8源码悦读:第五天
一、回顾
在第四天,阅读了通过过滤链创建数据库连接池的骨架,过滤器通过递归的方式不在在连接上增强,而底层调用的是:
DruidPooledConnection connection = dataSource.getConnectionDirect(maxWaitMillis);
二、dataSource.getConnectionDirect(maxWaitMillis)
2.1 进入一个无限循环:for(;;)
进入一个无限循环。
2.2 调用getConnectionInternal(maxWaitMillis)
获取一个内部连接。
默认maxWaitMillis
值为-1,也就是说,可以无限时间的等待,直到建立数据库连接。
(1)根据maxWaitMillis创建nanos
maxWaitMillis 的单位是毫秒,最大等待时间。将这个时间转换成纳秒
final long nanos = TimeUnit.MILLISECONDS.toNanos(maxWait);
(2)connectCount++;
connectCount++;
(3)takeLast();
DruidConnectionHolder holder = takeLast();
2.3 takeLast();
(1)emptySignal();
唤醒CreateThread 创建线程池
(2)notEmpty.await();
让notEmpty等待,让创建线程的方法运行。
(3)从线程池中取出最后一个,并将最后一个位置设置为null
DruidConnectionHolder last = connections[poolingCount];
connections[poolingCount] = null;
return last;
发现,这里创建线程池,使用到了多线程。并且创建数据库连接的线程是在init()
中初始化的。通过lock、empty、notempty来控制线程创建连接。