LD is tigger forever,CG are not brothers forever, throw the pot and shine forever.
Modesty is not false, solid is not naive, treacherous but not deceitful, stay with good people, and stay away from poor people.
talk is cheap, show others the code,Keep progress,make a better result.
Survive during the day and develop at night。
目录
概述
实现思路分析
1.Mybatis的源码分析:
数据库的源码源码分析:
数据源对象是比较复杂的对象,其创建过程相对比较复杂,对于 MyBatis 创建数据源,具体来讲有如下难点:
MyBatis 不但要能集成第三方的数据源组件,自身也提供了数据源的实现;
数据源的初始化参数较多,比较复杂;
MyBatis数据源模块的代码全部位于org.apache.ibatis.datasource包下:
DataSourceFactory是工厂的抽象接口:
DataSourceFactory接口拥有UnpooledDataSourceFactory和PooledDataSourceFactory两个实现类,UnpooledDataSourceFactory是未使用池化技术的数据源工厂类,PooledDataSourceFactory是使用了池化技术的数据源工厂类。它们两分别用于创建UnpooledDataSource和PooledDataSource,它们都实现了javax.sql.DataSource JDBC提供的数据
二. UnpooledDataSource源码分析
在JDK中官方定义了一个数据源接口,市面上所有第三方连接池(数据源)都应该实现这个接口:
UnpooledDataSource实际上是一个未使用池化技术的数据源,它实现了javax.sql.DataSource数据源标准(JDBC规定),但是在内部调用getConnection()方法时是通过创建Connection对象来实现的,由于每一次获取都创建新的连接对象,连接对象并没有进行复用,效率较低。其中UnpooledDataSource源码如下(只保留关键代码):
public class UnpooledDataSource implements DataSource {
private ClassLoader driverClassLoader;//驱动类的类加载器
private Properties driverProperties;//数据库连接的相关信息
private static Map<String, Driver> registeredDrivers = new ConcurrentHashMap<>();//缓存已注册的数据库驱动类
private String driver;
private String url;
private String username;
private String password;
private Boolean autoCommit;
private Integer defaultTransactionIsolationLevel;
private Integer defaultNetworkTimeout;
@Override
public Connection getConnection() throws SQLException {
return doGetConnection(username, password);
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
return doGetConnection(username, password);
}
private Connection doGetConnection(Properties properties) throws SQLException {
//初始化驱动
initializeDriver();
//重点在这里,连接对象使用过 DriverManager.getConnection创建的新的连接对象
Connection connection = DriverManager.getConnection(url, properties);
//配置连接
configureConnection(connection);
return connection;
}
…
}
三. PooledDataSource源码分析
PooledDataSource是Mybatis自己实现的数据库连接池,在分析它的源码之前我们首先要清楚作为一个连接池需要实现哪些功能。
作为一个数据库连接池,其最核心的功能是要做到Connection的复用,当用户调用连接池的getConnection获取连接时会在池中去拿,当用户调用Connection的close()方法时就会将该连接归还至连接池。而PooledDataSource实现上述功能需要借助另外两个类来实现:
PoolState:用于保存线程池的相关状态。
PooledConnection:Connection的加强类,用于加强原生close等方法,从而实现数据库连接的复用。
3.1 PoolState
在PoolState最核心的的是idleConnections和activeConnections,他们分别是存储空闲连接和非空闲连接的集合(在后文中出于习惯考虑,将其描述为空闲队列和活动队列)。
3.2 PooledDataSource
3.3 PooledConnection
在PooledDataSource中我们理解了Connection获取流程,当用户调用close方法时需要将该对象归还至数据库,而这一功能需要通过PooledConnection类来实现:
执行sql语句源码分析:
操作数据库源码分析:
分析:
小结:
参考资料和推荐阅读
1.链接: 参考资料.