【Mytais系列】Datasource模块:数据源连接
MyBatis 的 DataSource 模块是框架与数据库交互的核心基础设施,负责管理数据库连接的创建、分配、释放及池化,直接影响 SQL 执行效率和资源利用率。以下是其核心内容、功能及在 SQL 执行中的作用详解:
一、DataSource 模块的核心组件
| 组件 | 功能说明 | 
| 
 | 定义数据库连接的标准接口,核心方法是  | 
| 
 | 工厂类,用于解析配置并创建  | 
| 连接池实现 | 如  | 
| 
 | 控制连接的获取、释放、超时检测、有效性校验等。 | 
二、数据源类型及实现
1. 非池化数据源(UNPOOLED)
- 实现类:UnpooledDataSource
- 特点:
-  - 每次请求时创建新连接,执行完毕后直接关闭。
- 适用于简单场景或测试环境,性能较差(频繁创建/销毁连接开销大)。
 
- 配置示例:
<dataSource type="UNPOOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="123456"/>
</dataSource>
2. 池化数据源(POOLED)
- 实现类:PooledDataSource
- 特点:
-  - 维护一个连接池,复用空闲连接,减少创建/销毁开销。
- 支持连接池参数配置(如最大连接数、最小空闲连接、超时时间等)。
 
- 配置示例:
<dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="123456"/><property name="poolMaximumActiveConnections" value="20"/><property name="poolMaximumIdleConnections" value="10"/>
</dataSource>
3. 第三方数据源
- 常见实现:HikariCP、Druid、Tomcat JDBC Pool 等。
- 优势:
-  - 提供更高效的连接池管理、监控、统计功能。
- 支持更复杂的配置(如连接泄漏检测、慢 SQL 监控)。
 
- 集成方式:
<dataSource type="com.zaxxer.hikari.HikariDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="123456"/><property name="maximumPoolSize" value="20"/>
</dataSource>
-  - 通过 type指定全限定类名:
 
- 通过 
三、DataSource 在 SQL 执行中的作用
1. 连接获取
- 入口:Executor执行 SQL 前通过Transaction对象获取连接。
- 流程:

- 细节:
-  - 池化数据源会从池中返回空闲连接,若无可用连接则等待或抛出异常(取决于配置)。
- 非池化数据源直接创建新连接。
 
2. 连接释放
- 自动释放:若未启用事务,Executor执行完 SQL 后立即关闭连接。
- 事务控制:
-  - 启用事务时,连接由 SqlSession持有,直到调用commit()或rollback()后释放。
- 确保事务内多个操作使用同一连接,保证原子性。
 
- 启用事务时,连接由 
3. 连接池管理
- 空闲连接回收:定期检测并关闭长时间未使用的连接。
- 健康检查:验证连接的有效性(如通过 SELECT 1),避免使用已失效的连接。
- 超时控制:设置连接获取超时时间(poolMaximumCheckoutTime),防止长时间阻塞。
四、DataSource 模块的配置参数
通用参数(UNPOOLED/POOLED)
| 参数 | 说明 | 
| 
 | JDBC 驱动类名。 | 
| 
 | 数据库连接 URL。 | 
| 
 | 数据库认证信息。 | 
| 
 | 默认事务隔离级别(如  | 
池化专用参数(POOLED)
| 参数 | 说明 | 
| 
 | 最大活跃连接数(默认 10)。 | 
| 
 | 最大空闲连接数(默认 5)。 | 
| 
 | 连接获取超时时间(毫秒,默认 20000)。 | 
| 
 | 无可用连接时的等待时间(毫秒,默认 20000)。 | 
| 
 | 是否启用连接心跳检测(默认 false)。 | 
| 
 | 心跳检测 SQL(如  | 
五、最佳实践与注意事项
- 选择高效连接池:
-  - 生产环境推荐使用 HikariCP 或 Druid,性能优于 MyBatis 自带的 PooledDataSource。
- 示例(Spring Boot 中配置 HikariCP):
 
- 生产环境推荐使用 HikariCP 或 Druid,性能优于 MyBatis 自带的 
spring:datasource:type: com.zaxxer.hikari.HikariDataSourcehikari:maximum-pool-size: 20connection-timeout: 30000idle-timeout: 600000- 监控与调优:
-  - 监控连接池指标(活跃连接数、空闲连接数、等待线程数)。
- 根据负载调整 maximumPoolSize、minimumIdle等参数。
 
- 避免连接泄漏:
-  - 确保 SqlSession在 finally 块中关闭,或使用 try-with-resources。
- 启用连接泄漏检测(如 Druid 的 removeAbandoned参数)。
 
- 确保 
- 事务管理:
-  - 使用 Spring 的 @Transactional注解管理事务边界,避免手动提交/回滚。
 
- 使用 Spring 的 
六、总结
MyBatis 的 DataSource 模块是 SQL 执行的基础设施,通过高效管理数据库连接的生命周期和池化策略,显著提升系统性能。合理配置数据源类型及参数,结合第三方连接池的高级功能,可确保高并发场景下的稳定性和可扩展性。
