在 getConnectionDirect 中,druid主要做了下面的事情:
1、尝试获取连接,如果超时就判断是否达到尝试次数,在getConnectionInternal()方法中,如果没到且 activeCount+poolingCount < maxActive 则继续尝试,否则抛出超时异常。
2、获取到连接后判断如果开启testOnBorrow,就进行连接的校验。看连接是否正常。如果校验连接异常,则丢弃链接,重新尝试获取。
3、如果未开启 testOnBorrow,但开启testWhileIdle。则根据连接的idle时间判断,如果idle超过一定时间。则进行连接校验,判断连接是否正常。
4、连接校验完成之后,判断是否开启removeAbandoned。如果开启则将取到的连接重置ConnectedTimeNano为当前时间之后,放入activeConnections。这里我们可以回看一下DestroyConnectionThread的流程。它会判断当前时间-ConnectedTimeNano>设定值的连接为要丢弃的连接。言下之意,就是idle(空闲)超过设定值的连接将会被丢弃。
这段流程图如下: