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 连接池工作原理
-
初始化阶段:
- 创建初始的空闲连接(不超过
poolMaximumIdleConnections)
- 创建初始的空闲连接(不超过
-
获取连接:
- 首先尝试从空闲池获取可用连接
- 如果没有可用连接且未达到最大活动连接数,创建新连接
- 如果已达到最大活动连接数,等待直到有连接释放或超时
-
归还连接:
- 使用完毕后连接返回到空闲池
- 如果空闲池已满,则直接关闭连接
-
连接检测:
- 如果启用了
poolPingEnabled,会定期检测连接有效性 - 使用
poolPingQuery发送测试SQL验证连接
- 如果启用了
五、与第三方连接池对比
| 特性 | MyBatis POOLED | HikariCP | Druid |
|---|---|---|---|
| 性能 | 中等 | 极高 | 高 |
| 功能 | 基础 | 丰富 | 非常丰富 |
| 监控 | 无 | 基本 | 全面 |
| 适用场景 | 小型应用 | 高性能应用 | 企业级应用 |
六、最佳实践建议
-
生产环境建议:
- 对于生产环境,建议使用更成熟的连接池如 HikariCP 或 Druid
- POOLED 适合开发和测试环境使用
-
配置优化建议:
<!-- 优化后的配置示例 --> <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> -
常见问题处理:
- 连接泄漏:确保在所有代码路径中都正确关闭连接
- 连接超时:适当增加
poolMaximumCheckoutTime和poolTimeToWait - 连接失效:启用
poolPingEnabled并设置合理的检测间隔
-
升级到第三方连接池:
如果需要更强大的功能,可以轻松替换为其他连接池:<dataSource type="com.zaxxer.hikari.HikariDataSource"> <!-- HikariCP 配置 --> </dataSource>
MyBatis 的 POOLED 连接池提供了基本但够用的连接池功能,对于不复杂的小型应用来说是一个简便的选择。但对于需要更高性能、更好监控或更复杂功能的生产环境,建议考虑使用专门的连接池实现。
434

被折叠的 条评论
为什么被折叠?



