alibaba druid 连接池获取数据库连接过程解析

本文详细解析了alibaba druid连接池在初始化过程中的步骤,包括创建连接、初始化参数设置,以及初始化完成后如何通过getConnection()方法获取数据库连接。在获取连接时,涉及到了异步创建连接、加锁机制和从连接池中获取封装后的DruidPooledConnection的过程。重点关注DruidDataSource、DruidConnectionHolder和PhysicalConnectionInfo的角色以及CreateConnectionTask任务类。
摘要由CSDN通过智能技术生成

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);
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值