【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 执行的基础设施,通过高效管理数据库连接的生命周期和池化策略,显著提升系统性能。合理配置数据源类型及参数,结合第三方连接池的高级功能,可确保高并发场景下的稳定性和可扩展性。