理解 数据源、连接、会话(DataSource、Connection、 SqlSession)
学习中,理解可能不正确,不准确,请指正
什么是数据源?
数据源类似URL,比如 https://gitee.com/mini-bag/picture-bed/blob/master/img/cs.jpeg
就可以理解为一张图片的源,源并不代表数据本身,而是一个地址。通过数据源可以建立Connection,从而访问数据库而ibatis数据源由地址而额外属性组成,这些额外属性可以看做访问数据源的配置。
在UnpooledDataSource.java中,简单来看,数据源:
// 数据源地址 最重要
// url: jdbc:mysql://ip:port/db
private String url;
配置属性
private String username;
private String password;
private String driver;
// 自动提交事务
private Boolean autoCommit;
// 事务隔离等级
private Integer defaultTransactionIsolationLevel;
// 网络超时
private Integer defaultNetworkTimeout;
举个例子
在Spring项目中,数据源URL精确到dbName。
什么是Connection、什么是SqlSession
Connection与SqlSession之间的关系类似物理地址与逻辑地址。java.sql.Connection.java
中有如下注释,注意括号中session是对connection一种补充说明:
/**
* A connection (session) with a specific database
*/
不过,在ibatis中,一个SqlSession可以拥有多个Connection(连接池),这里主要说明ibatis中的SqlSession。
连接池中多个Connection可以在如下源码中找到:
// 一个连接池数据源
class PooledDataSource{
private final PoolState state = new PoolState(this);
}
class PoolState {
// 多个连接
protected final List<PooledConnection> idleConnections = new ArrayList<>();
protected final List<PooledConnection> activeConnections = new ArrayList<>();
}
SqlSession与Connection的联系还没有明确,暂时放弃
再来看下ibatis执行一次sql的函数调用栈
可以看到,查询方法先使用defaultSqlSession
,然后getConnection()
,根据调度策略,选取一个合适的Connection与进行数据库通信。
数据源 Connection SqlSession总结
数据源: 是数据的地址及一些额外的配置属性,使用这些数据,可以建立与数据库的链接
Connection: 连接数据源的物理链路
SqlSession: 连接数据源的逻辑链路,可以对应多个Connection,根据调度策略,选取其中一个Connection