mybatis源码分析_数据库源码分析

本文深入探讨MyBatis的数据源实现,包括未池化的UnpooledDataSource和池化的PooledDataSource。UnpooledDataSource每次获取连接都会创建新对象,效率较低,而PooledDataSource利用连接池技术提高性能,通过PoolState和PooledConnection管理连接的复用。此外,文章还涉及执行SQL语句和操作数据库的源码分析。

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

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.链接: 参考资料.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值