MyBatis 内置连接池 POOLED 详解

MyBatis 提供了一个内置的数据库连接池实现 POOLED,它是 MyBatis 自带的一个简单但高效的连接池实现。

一、POOLED 连接池基本特性

1. 核心特点

  • 轻量级实现:不依赖第三方连接池库
  • 基本功能完备:满足大多数小型应用的连接池需求
  • 配置简单:直接在 MyBatis 配置文件中设置
  • 自动管理:自动处理连接的获取、回收和释放

2. 适用场景

  • 中小型应用
  • 开发和测试环境
  • 不需要高级连接池功能的场景

二、配置方式

在 MyBatis 的配置文件中配置 POOLED 数据源:

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
      <property name="driver" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
      <property name="username" value="root"/>
      <property name="password" value="password"/>
      <!-- 以下是连接池特有配置 -->
      <property name="poolMaximumActiveConnections" value="10"/>
      <property name="poolMaximumIdleConnections" value="5"/>
      <property name="poolMaximumCheckoutTime" value="20000"/>
      <property name="poolTimeToWait" value="20000"/>
      <property name="poolPingQuery" value="SELECT 1"/>
      <property name="poolPingEnabled" value="true"/>
      <property name="poolPingConnectionsNotUsedFor" value="3600000"/>
    </dataSource>
  </environment>
</environments>

三、主要配置参数详解

参数名说明默认值
poolMaximumActiveConnections连接池中最大活动连接数10
poolMaximumIdleConnections连接池中最大空闲连接数5
poolMaximumCheckoutTime连接被检出后的最大使用时间(毫秒)20000
poolTimeToWait获取连接时的等待超时时间(毫秒)20000
poolPingQuery用于检测连接是否有效的SQL语句
poolPingEnabled是否启用连接检测false
poolPingConnectionsNotUsedFor连接多久未使用后需要检测(毫秒)0

四、POOLED 连接池工作原理

  1. 初始化阶段

    • 创建初始的空闲连接(不超过poolMaximumIdleConnections
  2. 获取连接

    • 首先尝试从空闲池获取可用连接
    • 如果没有可用连接且未达到最大活动连接数,创建新连接
    • 如果已达到最大活动连接数,等待直到有连接释放或超时
  3. 归还连接

    • 使用完毕后连接返回到空闲池
    • 如果空闲池已满,则直接关闭连接
  4. 连接检测

    • 如果启用了poolPingEnabled,会定期检测连接有效性
    • 使用poolPingQuery发送测试SQL验证连接

五、与第三方连接池对比

特性MyBatis POOLEDHikariCPDruid
性能中等极高
功能基础丰富非常丰富
监控基本全面
适用场景小型应用高性能应用企业级应用

六、最佳实践建议

  1. 生产环境建议

    • 对于生产环境,建议使用更成熟的连接池如 HikariCP 或 Druid
    • POOLED 适合开发和测试环境使用
  2. 配置优化建议

    <!-- 优化后的配置示例 -->
    <dataSource type="POOLED">
      <property name="driver" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
      <property name="username" value="root"/>
      <property name="password" value="password"/>
      <property name="poolMaximumActiveConnections" value="20"/>
      <property name="poolMaximumIdleConnections" value="10"/>
      <property name="poolMaximumCheckoutTime" value="30000"/>
      <property name="poolTimeToWait" value="10000"/>
      <property name="poolPingEnabled" value="true"/>
      <property name="poolPingQuery" value="SELECT 1"/>
      <property name="poolPingConnectionsNotUsedFor" value="3600000"/>
    </dataSource>
    
  3. 常见问题处理

    • 连接泄漏:确保在所有代码路径中都正确关闭连接
    • 连接超时:适当增加poolMaximumCheckoutTimepoolTimeToWait
    • 连接失效:启用poolPingEnabled并设置合理的检测间隔
  4. 升级到第三方连接池
    如果需要更强大的功能,可以轻松替换为其他连接池:

    <dataSource type="com.zaxxer.hikari.HikariDataSource">
      <!-- HikariCP 配置 -->
    </dataSource>
    

MyBatis 的 POOLED 连接池提供了基本但够用的连接池功能,对于不复杂的小型应用来说是一个简便的选择。但对于需要更高性能、更好监控或更复杂功能的生产环境,建议考虑使用专门的连接池实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值