当前位置: 首页 > news >正文

【Mytais系列】Datasource模块:数据源连接

MyBatis 的 DataSource 模块是框架与数据库交互的核心基础设施,负责管理数据库连接的创建、分配、释放及池化,直接影响 SQL 执行效率和资源利用率。以下是其核心内容、功能及在 SQL 执行中的作用详解:


一、DataSource 模块的核心组件

组件

功能说明

DataSource 接口

定义数据库连接的标准接口,核心方法是 getConnection()

DataSourceFactory

工厂类,用于解析配置并创建 DataSource 实例(如 PooledDataSourceFactory)。

连接池实现

PooledDataSource(MyBatis 自带)、第三方池(HikariCP、Druid 等)。

Connection 管理

控制连接的获取、释放、超时检测、有效性校验等。


二、数据源类型及实现

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)

参数

说明

driver

JDBC 驱动类名。

url

数据库连接 URL。

username/password

数据库认证信息。

defaultTransactionIsolation

默认事务隔离级别(如 READ_COMMITTED)。

池化专用参数(POOLED)

参数

说明

poolMaximumActiveConnections

最大活跃连接数(默认 10)。

poolMaximumIdleConnections

最大空闲连接数(默认 5)。

poolMaximumCheckoutTime

连接获取超时时间(毫秒,默认 20000)。

poolTimeToWait

无可用连接时的等待时间(毫秒,默认 20000)。

poolPingEnabled

是否启用连接心跳检测(默认 false)。

poolPingQuery

心跳检测 SQL(如 SELECT 1)。


五、最佳实践与注意事项

  1. 选择高效连接池
    • 生产环境推荐使用 HikariCPDruid,性能优于 MyBatis 自带的 PooledDataSource
    • 示例(Spring Boot 中配置 HikariCP):
spring:datasource:type: com.zaxxer.hikari.HikariDataSourcehikari:maximum-pool-size: 20connection-timeout: 30000idle-timeout: 600000
  1. 监控与调优
    • 监控连接池指标(活跃连接数、空闲连接数、等待线程数)。
    • 根据负载调整 maximumPoolSizeminimumIdle 等参数。
  1. 避免连接泄漏
    • 确保 SqlSession 在 finally 块中关闭,或使用 try-with-resources。
    • 启用连接泄漏检测(如 Druid 的 removeAbandoned 参数)。
  1. 事务管理
    • 使用 Spring 的 @Transactional 注解管理事务边界,避免手动提交/回滚。

六、总结

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

http://www.xdnf.cn/news/271927.html

相关文章:

  • MCP 探索:browser tools MCP + Cursor 可以实现哪些能力
  • VBA 64位API声明语句第009讲
  • 2025深圳杯(东三省)数学建模竞赛D题完整分析论文(共36页)(含模型、可运行代码、数据结果)
  • (超2万字数详解)C++学习之类与对象
  • SwiftUI-MLX本地大模型开发(二)
  • 射频指标互调与交调简略
  • ubuntu使用apt安装软件
  • python中的yield关键字用法
  • 数据赋能(209)——质量管理——时效性原则
  • 文献分享:抗体治疗癌症综述
  • EMMC存储性能测试方法
  • FramePack部署(从PyCharm解释器创建和使用开始)保姆级教程
  • 基于SpringBoot的篮球竞赛预约平台设计与实现
  • 数据赋能(210)——质量管理——可靠性原则
  • FastAPI系列13:API的安全防护
  • 经典算法 最小生成树(prim算法)
  • QT6 源(70):阅读与注释按钮类 QPushButton,及各种属性验证,
  • 返回倒数第k个节点题解
  • 学习黑客分析案例
  • 山东大学计算机组成与设计第九、十章习题解析
  • 延时启动windows中程序
  • C++Primerplus编程练习 第五章
  • 继V1.5之后,幻方又发布了 DeepSeek-Prover-V2-671B,参数提升100倍
  • 【AI平台】n8n入门6:调用MCP服务(非社区节点)
  • 构建灵活的配置管理系统:YAML 与 TOML 的应用与热更新实践
  • 生成树、Prime、Kruskal
  • 第40课 常用快捷操作——按“Tab键”即时更改属性
  • 为什么需要启动探针(StartupProb)?
  • neatchat轻量级丝滑的ai模型web客户端
  • python进阶(2)二进制