Mybatis学习笔记——数据源

作者:亦山
来源:CSDN
原文:https://blog.csdn.net/luanlouis/article/details/37671851
版权声明:本文为博主原创文章,转载请附上博文链接!

连接池意义

在不使用连接池情况下,操作一次数据库需要创建一个Connection对象,使用完以后调用close()方法 销毁。在频繁操作数据库的情况下,需要频繁的创建和销毁Connection对象,代价非常高。使用连接池时,相当于创建了一堆连接对象,这些对象分为两种状态,一种是空闲,另一种是使用中。当一个需要执行一个SQl语句时,从空闲区域调出一个Connection对象,使用完以后将Connection改为空闲以便后面使用。

连接池的定义

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从缓冲池中取出一个了,使用完毕后再放回去。我们可以通过设定连接池最大数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库连接使用数量,使用情况,为系统开发,测试以及性能调整提供依据。

Mybatis中数据源种类

  • UNPOOLED 不使用连接池数据源
  • POOLED 使用连接池数据源
  • JNDI 使用JNDI实现的数据源

UnpooledDataSource和PooledDataSource都实现了DataSource接口
在PooledDataSource中定义了UnPooledDataSource对象
PooledDataSrouce是通过UnPooledDataSource来实现连接池
PooledDataSource只是提供一种缓存连接池机制

<dataSource type="POOLED">
	<property name="driver" value="${jdbc.driverClassName}"/>
	<property name="url" value="${jdbc.url}"/>
	<property name="username" value="${jdbc.username}"/>
	<property name="password" value="${jdbc.password}"/>
</dataSource>

1、Mybatis在初始化时,解析此文件,根据的type属性来创建相应的数据源dataSource,即Mybatis根据上面XML文件会创建PooledDataSource实现。

2、Mybatis根据工厂模式来创建数据源DataSource对象的,Mybatis定义了抽象的工厂接口org.apache.ibatis.datasource.DataSourceFactory,通过其getDataSource()方法返回数据源DataSource:

public interface DataSourceFactory {
    void setProperties(Properties var1);

    DataSource getDataSource();
}

3、DataSource什么时候创建Connection对象
在SqlSession对象调用sql方法时,才会触发Mybatis在底层执行下面这个方法创建java.sql.Connection对象:
关于大佬这段博文中,我找不到这个方法:

protected void openConnection() throws SQLException {
    if (log.isDebugEnabled()) {
      log.debug("Opening JDBC Connection");
    }
    connection = dataSource.getConnection();
    if (level != null) {
      connection.setTransactionIsolation(level.getLevel());
    }
    setDesiredAutoCommit(autoCommmit);
  }

获取java.sql.Connection对象的过程

 public Connection getConnection() throws SQLException {
    return popConnection(dataSource.getUsername(), dataSource.getPassword()).getProxyConnection();
  }
 
  public Connection getConnection(String username, String password) throws SQLException {
    return popConnection(username, password).getProxyConnection();
  }

上述的popConnection()方法,会从连接池中返回一个可用的PooledConnection对象,然后再调用getProxyConnection()方法最终返回Conection对象。

  1. 先看是否有空闲(idle)状态下的PooledConnection对象,如果有,就直接返回一个可用的PooledConnection对象;否则进行第2步。
  2. 查看活动状态的PooledConnection池activeConnections是否已满;如果没有满,则创建一个新的PooledConnection对象,然后放到activeConnections池中,然后返回此PooledConnection对象;否则进行第三步;
  3. 看最先进入activeConnections池中的PooledConnection对象是否已经过期:如果已经过期,从activeConnections池中移除此对象,然后创建一个新的PooledConnection对象,添加到activeConnections中,然后将此对象返回;否则进行第4步。
  4. 线程等待第二步。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值