【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.mzph.cn/bicheng/79542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 组件prop添加类型

给函数的props做注解 import { useState } from reacttype Props { className:string,title?:string } // 自定义一个Button组件 function Button(props:Props){// 解构出classname\const {className} propsreturn <button className{className}>点击我</button&g…

MCP多智能体消息传递机制(Message Passing Between Agents)

目录 &#x1f680; MCP多智能体消息传递机制&#xff08;Message Passing Between Agents&#xff09; &#x1f31f; 为什么要引入消息传递机制&#xff1f; &#x1f3d7;️ 核心设计&#xff1a;Agent间消息传递模型 &#x1f6e0;️ 1. 定义标准消息格式 &#x1f6e…

高中数学联赛模拟试题精选学数学系列第4套几何题

△ A B C \triangle ABC △ABC 的外心为点 O O O, 外接圆为 Γ \Gamma Γ. 射线 A O AO AO, B O BO BO, C O CO CO 分别交 Γ \Gamma Γ 于点 D D D, E E E, F F F. X X X 是 △ A B C \triangle ABC △ABC 内部的一点. 射线 A X AX AX, B X BX BX, C X CX CX 分…

如何实现Prometheus告警规则动态配置

在大部分的项目中都有自定义告警规则的需求&#xff0c;目前市面上都是基于Prometheus实现的监控告警。但是Prometheus本身并不支持修改告警规则自动生效&#xff0c;我们可以通过下面这些步骤实现告警规则动态配置。 1. 启动Promethues并指定参数--web.enable-lifecycle noh…

私人医生通过AI分析基因数据,是否有权提前告知癌症风险?

首席数据官高鹏律师团队编著 在精准医疗的浪潮中&#xff0c;私人医生借助AI技术解析基因数据、预判癌症风险&#xff0c;已成为高端医疗服务的“隐形标配”。然而&#xff0c;这一技术的光环之下&#xff0c;潜藏着法律与伦理的复杂博弈——医生是否有权基于AI的基因分析提前…

TFT(薄膜晶体管)和LCD(液晶显示器)区别

TFT&#xff08;薄膜晶体管&#xff09;和LCD&#xff08;液晶显示器&#xff09;是显示技术中常见的术语&#xff0c;二者既有联系又有区别。以下是它们的核心区别和关系&#xff1a; 1. 基本概念 LCD&#xff08;液晶显示器&#xff09; LCD是一种利用液晶材料特性控制光线通…

Go小技巧易错点100例(二十八)

本期分享&#xff1a; 1. runtime.Caller(1)获取调用者信息 2. for循环 select{}语法 正文&#xff1a; runtime.Caller(1)获取调用者信息 在 Go 语言中&#xff0c;runtime.Caller(1) 是 runtime 包提供的一个函数&#xff0c;用于获取当前 goroutine 的调用堆栈中的特定…

ipvsadm,是一个什么工具?

1. ipvsadm 是什么&#xff1f; ipvsadm&#xff08;IP Virtual Server Administration&#xff09;是 Linux 内核中 IPVS&#xff08;IP Virtual Server&#xff09; 模块的管理工具&#xff0c;用于配置和监控内核级的负载均衡规则。它是 Kubernetes 中 kube-proxy 在 IPVS …

用手机相册教我数组概念——照片分类术[特殊字符][特殊字符]

目录 前言一、现实场景1.1 手机相册的照片管理1.2 照片分类的需求 二、技术映射2.1 数组与照片分类的对应关系2.2 数组索引与照片标签的类比 三、知识点呈现3.1 数组的基本概念3.2 数组在编程中的重要性3.3 数组的定义与初始化3.4 数组的常见操作&#xff08;增删改查&#xff…

Java面试资源获取

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 **1. GitHub开源项目****2. 技术博客与社区*…

spring中的@Conditional注解详解

Conditional是Spring框架中用于条件化Bean注册的核心注解&#xff0c;它允许开发者根据特定条件动态决定是否将Bean注册到Spring容器中。这一特性在模块化开发、多环境适配和动态配置等场景中非常有用。 核心原理 Conditional注解通过实现Condition接口的类来定义条件逻辑。当…

MYSQL-设计表

一.范式 数据库的范式是⼀组规则。在设计关系数据库时&#xff0c;遵从不同的规范要求&#xff0c;设计出合理的关系型数 据库&#xff0c;这些不同的规范要求被称为不同的范式。 关系数据库有六种范式&#xff1a;第⼀范式&#xff08;1NF&#xff09;、第⼆范式&#xff08;…

第三方测试机构在软件测试领域有何重大作用与优势?

第三方测试机构在软件测试领域作用重大&#xff0c;它就像公正的裁判&#xff0c;能帮助确保软件质量&#xff0c;能保障软件可靠性&#xff0c;通过提供专业测试服务&#xff0c;为软件安全性提供保障&#xff0c;也为软件稳定性提供保障。 机构优势 第三方测试机构具有独立…

大模型——使用 StarRocks 作为向量数据库

大模型——使用 StarRocks 作为向量数据库 本章节介绍了 StarRocks,这是一款高性能的分析数据库,并演示了如何将其用作向量数据库。内容涵盖了设置、文档加载、标记化、创建向量数据库实例以及构建一个能够检索的问答系统。 StarRocks StarRocks 是一个次世代的亚秒级 MPP…

怎样增加AI对话的拟人化和增加同理心

怎样增加AI对话的拟人化和增加同理心 随着心理健康问题在大学生中日益普遍,AI聊天机器人被用于提供支持,但如何有效表达同理心成为挑战。本文对比了人与人、人与AI互动中同理心的表达与接收,通过让126名本科生讲述生活事件并收集亚马逊MTurkers的评价,同时使用GPT-4o评估相…

SALOME源码分析:SHAPER模块

本文分析SALOME中的SHAPER模块。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。注2&#xff1a;文章内容会不定期更新。 一、核心组件 二、关键流程 三、FAQs 网络资料 Introduction to SHAPER

batch normalization和layer normalization区别

Normalization无非就是这样一个操作&#xff1a; 其中x是输入数据&#xff0c;维度为&#xff08;B&#xff0c;T&#xff0c;C&#xff09;&#xff0c;其中B是batchsize&#xff0c;T是序列长度&#xff0c;C是embedding维度&#xff1b;括号内是标准化操作&#xff0c;γ和…

Postgresql源码(144)LockRelease常规锁释放流程分析

相关 《Postgresql源码&#xff08;69&#xff09;常规锁细节分析》 最新遇到一个共享内存损坏导致常规锁释放报错warning "you don’t own a lock of type"的问题。 本篇对常规锁的概念做一些回顾&#xff0c;顺便分析下释放锁的流程。 SpinLock&#xff1a;❎LWL…

基于bert的情感分析程序

文章目录 任务介绍数据概览注意事项数据处理代码准备模型构建与训练模型类构建数据集构建数据批处理模型参数查看模型训练结果推理与评估模型推理准确率评估附录任务介绍 在当今信息爆炸的时代,互联网上充斥着海量的文本数据,如社交媒体评论、产品评价、新闻报道等。这些文本…

宇树科技举办“人型机器人格斗大赛”

2025 年 5 月至 6 月&#xff0c;一场全球瞩目的科技盛宴 —— 全球首场 “人形机器人格斗大赛”&#xff0c;将由杭州宇树科技盛大举办。届时&#xff0c;观众将迎来机器人格斗领域前所未有的视觉震撼。 为打造最强参赛阵容&#xff0c;宇树科技技术团队在过去数周里&#xf…