第二章、DruidDataSource 和 DruidAbstractDataSource

本文详细探讨了DruidDataSource和DruidAbstractDataSource的关系,包括DruidAbstractDataSource的基本构造,DruidDataSource的连接获取方式,初始化过程以及getConnectionDirect方法的工作原理。通过对这些关键点的分析,为读者提供了全面的Druid数据源理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



一、DruidAbstractDataSource


    protected ReentrantLock                            lock;
    protected Condition                                notEmpty;
    protected Condition                                empty;

   // DruidDataSource 构造函数会调用下面的方法
   public DruidAbstractDataSource(boolean lockFair){
   
   
        lock = new ReentrantLock(lockFair);

        notEmpty = lock.newCondition();
        empty = lock.newCondition();
    }

二、DruidDataSource

DruidDataSource 类的继承关系
在这里插入图片描述

DruidDataSource 的构造方法

	public DruidDataSource(){
   
   
        this(false);
    }
	// fairLock 是否是公平锁
    public DruidDataSource(boolean fairLock){
   
   
    	// 调用 DruidAbstractDataSource 构造函数
        super(fairLock);
		
		// 通过读取配置设置参数
        configFromPropety(System.getProperties());
    }

DruidDataSource.getConnection() 获取到连接


    @Override
    public DruidPooledConnection getConnection() throws SQLException {
   
   
        return getConnection(maxWait);
    }

    public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
   
   
    	// 初始化
        init();
		
        if (filters.size() > 0) {
   
   
            // 如果存在过滤器,则通过责任链模式调用所有filter
            FilterChainImpl filterChain = new FilterChainImpl(this);
            return filterChain.dataSource_connect(this, maxWaitMillis);
        } else {
   
   
        	// 这里面有很多细节,主要就是返回一个DruidPooledConnection对象
            return getConnectionDirect(maxWaitMillis);
        }
    }

init 初始化方法

    public void init() throws SQLException {
   
   
    // 防止重复初始化,这块应该会用锁保证
        if (inited) {
   
   
            return;
        }

        // bug fixed for dead lock, for issue #2980
        DruidDriver.getInstance();

        final ReentrantLock lock = this.lock;
        try {
   
   
        	// 可以被打断的锁
            lock.lockInterruptibly();
        } catch (InterruptedException e) {
   
   
            throw new SQLException("interrupt", e);
        }

        boolean init = false;
        try {
   
   
            if (inited) {
   
   
                return;
            }
			// 堆栈信息
            initStackTrace = Utils.toString(Thread.currentThread().getStackTrace());

            this.id = DruidDriver.createDataSourceId();
            if (this.id > 1) {
   
   
                long delta = (this.id - 1) * 100000;
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值