数据源
数据源解析
解析配置文件中的数据源
- 事务模版 - jdbc
- 数据源实现 - 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
在 Mybatis 数据源的实现中,包括两部分分为无池化的 UnpooledDataSource 实现类和有池化的 PooledDataSource 实现类,池化的实现类 PooledDataSource 以对无池化的 UnpooledDataSource 进行扩展处理。把创建出来的链接保存到内存中,记录为空闲链接和活跃链接,在不同的阶段进行使用。
无池化 - UnpooledDataSource
- 在创建完成连接以后,把链接存放到驱动注册器中,方便后续使用中可以直接获取链接,避免重复创建所带来的资源消耗。
有池化 - PooledConnection
PooledConnection
由于我们需要对连接进行池化处理,所以当链接调用一些 CLOSE 方法的时候,也需要把链接从池中关闭和恢复可用,允许其他用户获取到链接。那么这里就需要对连接类进行代理包装,处理 CLOSE 方法。
pushConnection - 回收数据源
- 核心在于判断链接是否有效,并进行相关的空闲链接校验。
- 判断是否把连接回收到 idle 空闲链接列表中,并通知其他线程来抢占。
如果现在空闲链接充足,那么这个回收的链接则会进行回滚和关闭的处理中。
connection.getRealConnection().close();
如果空闲链接不充足,新建一个链接到空闲列表。
对回收的链接进行回滚和关闭。
popConnection - 获取数据源
- 如果有空闲链接,直接返回
- 如果没有空闲链接,创建新的链接
- 如果活跃链接数不足,直接创建即可。
- 如果活跃链接数已满,则从队列中获取第一个链接,判断是否过期。
- 如果过期,删除该链接,并重新创建一个新的链接。
- 如果未过期,则进行等待,超时则获取链接失败。