Mybatis获取数据源连接原理

Mybatis获取数据源连接原理

Mybatis获取数据源的创建使用工厂模式,基本分为两种:

  • 有带连接池的数据源
  • 不带连接池的数据源

不带连接池的数据源获取类似于jdbc连接,不做过多介绍,详细写一下带连接池的数据源;

获取带连接池的数据源的连接原理:

  1. 带有连接池的数据源对象中包含PoolState(连接池状态,定义了一个数据结构,两个连接池是ArrayList),调用PoolDataSource.getConnection方法会调用自己内部的popConnect方法,返回PooledConnection,最后调用PooledConnect.getProxyConnection方法返回连接(运用了代理模式)。
  2. 调用PoolDataSource.popConnection时,会先锁定PoolState对象,防止对象中两个不是线程安全的ArrayList出现并发导致不安全。
  3. 首先判断idleConnections空闲连接池是否为空,如果不为空,则获取一个空闲连接,并加入到activeConnections活跃连接池中。如果idleConnections空闲连接池为空,则进入第4步骤。
  4. 判断activeConnections活跃连接池是否已满,如果activeConnections活跃连接池没有满,就创建一个新的PooledConnection对象。如果activeConnections活跃连接池已经满了,则进入第5步骤
  5. 判断activeConnections活跃连接池中是否有超时连接,从activeConnections活跃连接池中获取最老的连接,检查设计的超时时间,如果超时了,就从activeConnections活跃连接池中移除此代理连接,移除的真实连接会判断回滚,复用移除的真实连接对象,创建代理连接对象。再检查此代理对象的valid、realConncetion等信息是否可用,是否需要回滚,并设置相关信息到PoolState和代理连接对象中,最终返回。如果activeConnections活跃连接池中没有超时连接,则进入第6步骤。
  6. 如果没有超时连接,此次获取连接将使用wait()方法进行等待,并记录相关时间到PoolState。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值