alibaba druid 连接池获取数据库连接过程解析
1.初始化过程
主要看DruidDataSource这个类
看怎么创建连接的要从getConnection()这个方法看起
getConnection()中有个init()初始化方法
init做的事情就是加锁,然后判断各种条件参数是否符合要求,给内部各种参数赋值
需要关心的就是下面的代码
connections = new DruidConnectionHolder[maxActive];
evictConnections = new DruidConnectionHolder[maxActive];
keepAliveConnections = new DruidConnectionHolder[maxActive];
这三个数组里面放了具体的连接
一个存放所有连接,一个回收的连接,一个放存活在保持的连接
需要注意的是这三个数组里面放的是DruidConnectionHolder对象,这个对应是对PhysicalConnectionInfo物理连接信息进行包装的一个类,而PhysicalConnectionInfo又是对Connection的一次包装
下面这段代码就是具体的初始化连接池的过程
主要分为同步和异步
异步就是将创建连接的任务交给一个线程池去处理,一直异步创建知道达到initialSize为止
同步的过程大致差不多
if (createScheduler != null && asyncInit) {
for (int i = 0; i < initialSize; ++i) {
createTaskCount++;
CreateConnectionTask task = new CreateConnectionTask(true);
this.createSchedulerFuture = createScheduler.submit(task);
}
} else if (!asyncInit) {
// init connections
while (poolingCount < initialSize) {
try {
PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection();
DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo);