Skip to content

数据源

数据源解析

解析配置文件中的数据源

  1. 事务模版 - jdbc
  2. 数据源实现 - druid
xml
<configuration>

    <!--    数据源配置   -->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="DRUID">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>  

    <!--    映射文件配置   -->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

</configuration>

数据库连接池

在配置数据源的时候我们可以使用默认的 hikair 连接池,或者 dpcp 连接池。

java
########### spring datasource config ###########
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=600000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=500
spring.datasource.hikari.login-timeout=500
spring.datasource.hikari.validation-timeout=1000
spring.datasource.hikari.initialization-fail-timeout=1000

image-20250627175252036

在 Mybatis 数据源的实现中,包括两部分分为无池化的 UnpooledDataSource 实现类和有池化的 PooledDataSource 实现类,池化的实现类 PooledDataSource 以对无池化的 UnpooledDataSource 进行扩展处理。把创建出来的链接保存到内存中,记录为空闲链接和活跃链接,在不同的阶段进行使用。

无池化 - UnpooledDataSource

  • 在创建完成连接以后,把链接存放到驱动注册器中,方便后续使用中可以直接获取链接,避免重复创建所带来的资源消耗。

有池化 - PooledConnection

  • PooledConnection

    由于我们需要对连接进行池化处理,所以当链接调用一些 CLOSE 方法的时候,也需要把链接从池中关闭和恢复可用,允许其他用户获取到链接。那么这里就需要对连接类进行代理包装,处理 CLOSE 方法。

  • pushConnection - 回收数据源

    1. 核心在于判断链接是否有效,并进行相关的空闲链接校验。
    2. 判断是否把连接回收到 idle 空闲链接列表中,并通知其他线程来抢占。
      • 如果现在空闲链接充足,那么这个回收的链接则会进行回滚和关闭的处理中。connection.getRealConnection().close();

      • 如果空闲链接不充足,新建一个链接到空闲列表。

        对回收的链接进行回滚和关闭。

  • popConnection - 获取数据源

    1. 如果有空闲链接,直接返回
    2. 如果没有空闲链接,创建新的链接
      • 如果活跃链接数不足,直接创建即可。
      • 如果活跃链接数已满,则从队列中获取第一个链接,判断是否过期。
        • 如果过期,删除该链接,并重新创建一个新的链接。
        • 如果未过期,则进行等待,超时则获取链接失败。