从最简单的测试用例开始
从有个测试用例看连接的建立: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的原因。