Druid源码学习(一)

从最简单的测试用例开始

从有个测试用例看连接的建立:Demo0

public class Demo0 extends TestCase {

    private String jdbcUrl;
    private String user;
    private String password;
    private String driverClass;
    private int    initialSize = 10;
    private int    minPoolSize = 1;
    private int    maxPoolSize = 2;
    private int    maxActive   = 2;

    protected void setUp() throws Exception {
        jdbcUrl = "jdbc:fake:dragoon_v25masterdb";
        user = "dragoon25";
        password = "dragoon25";
        driverClass = "com.alibaba.druid.mock.MockDriver";
    }

    public void test_0() throws Exception {
        DruidDataSource dataSource = new DruidDataSource();

        JMXUtils.register("com.alibaba:type=DruidDataSource", dataSource);

        dataSource.setInitialSize(initialSize);
        dataSource.setMaxActive(maxActive);
        dataSource.setMinIdle(minPoolSize);
        dataSource.setMaxIdle(maxPoolSize);
        dataSource.setPoolPreparedStatements(true);
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(jdbcUrl);
        dataSource.setPoolPreparedStatements(true);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        dataSource.setValidationQuery("SELECT 1");
        dataSource.setTestOnBorrow(true);

        Connection conn = dataSource.getConnection();
        conn.close();

        System.out.println();
    }
}

代码比较简单,主要用过连接池的都知道。这里就是创建了一个Druid的数据源,然后获取一个连接最后关闭。

接下来继续追踪getConnection方法。这个方法的流程图如下:

 

这个流程比较清晰:

1.先进行初始化

2.判断是否存在filter,如果存在就使用过滤链的数据源获取连接。如果不存在就使用直接获取连接的方式获取数据库连接。

这里有个知识点细节:Connection是什么?

在java中这个是接口,不是类。所以在Druid中返回的是DruidPooledConnection对象。

另一个知识点细节:为什么叫PooledConnection而不是Connection?

因为我们叫的连接池连接,这种连接不会直接关闭,而是被回收。一般的连接关闭就直接关闭了。所以如果要实现数据库连接池,就要使用连接池的连接。在java中提供了连接池连接接口:PooledConnection。所以这里的DruidPooledConnection对象也要实现这个接口。

public class DruidPooledConnection extends PoolableWrapper implements javax.sql.PooledConnection, Connection {

}

总结:

1.看源码最好的方式就是通过一个简单的测试用例,使用打断点的方式来跟踪逻辑。

2.这篇文章只是介绍了获取数据库连接最外层简单的逻辑。下一篇文章会针对逻辑中的init方法进行分析

3.Connection是接口不是类。同时如果想实现数据库连接池,那么就必须要实现接口PooledConnection。

彩蛋

额外了解的一个issure(https://github.com/alibaba/druid/issues/2980),了解在多线程情况下如何出现死锁Bug。修复这段bug的代码在:

 public void init() throws SQLException {
        if (inited) {
            return;
        }

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

        。。。。
}

下一篇文章会详细了解这个Bug的原因。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值