MyBatis 的 数据源(DataSource) 是管理数据库连接的核心模块,负责连接的创建、复用和释放。合理配置数据源对应用性能至关重要。
一、数据源的作用
- 连接管理:高效创建和释放数据库连接,避免频繁建立连接的开销。
- 连接复用:通过连接池复用空闲连接,提升性能。
- 资源控制:限制最大连接数,防止数据库过载。
二、MyBatis 支持的数据源类型
MyBatis 内置三种数据源,并支持集成第三方连接池:
| 类型 | 特点 | 适用场景 |
|---|---|---|
UNPOOLED | 非池化数据源,每次请求新建连接,用后关闭。 | 简单测试、低并发场景。 |
POOLED | MyBatis 自带连接池,复用空闲连接。 | 中小型生产环境,无需第三方依赖。 |
JNDI | 从 Java EE 容器(如 Tomcat)获取数据源。 | 容器管理的生产环境(如 Tomcat)。 |
| 第三方连接池 | 如 HikariCP、Druid、C3P0,性能更优,功能丰富。 | 高并发、高性能要求的场景。 |
三、数据源的配置方式
1. 内置数据源配置(mybatis-config.xml)
<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/test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- 连接池参数 -->
<property name="poolMaximumActiveConnections" value="20"/>
<property name="poolMaximumIdleConnections" value="10"/>
<property name="poolMaximumCheckoutTime" value="20000"/>
</dataSource>
</environment>
</environments>
2. 第三方数据源集成(以 HikariCP 为例)
-
步骤 1:添加依赖
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> -
步骤 2:配置数据源
<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"/> <!-- HikariCP 连接池参数 --> <property name="maximumPoolSize" value="20"/> <property name="connectionTimeout" value="30000"/> </dataSource>
四、数据源的底层实现
1. DataSourceFactory 接口
MyBatis 通过 DataSourceFactory 接口创建数据源实例,不同数据源对应不同的工厂类:
UnpooledDataSourceFactory:创建UNPOOLED数据源。PooledDataSourceFactory:创建POOLED数据源。JndiDataSourceFactory:创建JNDI数据源。
2. 数据源与 SqlSessionFactory 的关系
SqlSessionFactory在初始化时,通过Environment对象加载数据源配置。- 数据源生命周期与
SqlSessionFactory一致,通常为应用级单例。
五、数据源最佳实践
1. 选择合适的数据源
- 小型应用:使用内置
POOLED数据源,简单够用。 - 高并发生产环境:选择 HikariCP(性能最优)或 Druid(功能全面,支持监控)。
2. 关键参数配置
-
HikariCP 推荐配置:
maximumPoolSize=20 # 最大连接数(根据并发量调整) connectionTimeout=30000 # 连接超时时间(毫秒) idleTimeout=600000 # 空闲连接超时释放时间 maxLifetime=1800000 # 连接最大存活时间 -
Druid 推荐配置:
initialSize=5 # 初始连接数 maxActive=20 # 最大活跃连接数 minIdle=5 # 最小空闲连接数 validationQuery=SELECT 1 # 连接有效性检查 SQL
3. 监控与调优
-
Druid 监控: 启用内置监控页面,实时查看连接池状态。
@Bean public ServletRegistrationBean<StatViewServlet> druidStatViewServlet() { ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>( new StatViewServlet(), "/druid/*" ); bean.addInitParameter("loginUsername", "admin"); bean.addInitParameter("loginPassword", "admin"); return bean; } -
HikariCP 日志监控: 通过日志输出连接池状态(需配置 Log4j 或 SLF4J)。
4. 避免常见问题
- 连接泄漏:确保每次操作后关闭
SqlSession。 - 连接耗尽:合理设置
maxActive,避免超出数据库最大连接数。 - 长时间空闲连接:配置
idleTimeout自动回收。
六、数据源与 Spring 集成
在 Spring 中,通常直接配置第三方数据源 Bean,MyBatis 通过 SqlSessionFactoryBean 引用:
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("123456");
config.setMaximumPoolSize(20);
return new HikariDataSource(config);
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
return factoryBean.getObject();
}
总结
MyBatis 数据源是数据库连接管理的核心,合理选择和配置数据源可显著提升应用性能。关键点包括:
- 按需选择类型:简单场景用内置
POOLED,高并发用 HikariCP 或 Druid。 - 优化连接池参数:根据并发量和数据库负载调整连接数及超时时间。
- 集成监控工具:通过 Druid 或 HikariCP 的监控功能,实时诊断连接池状态。
- 避免资源泄漏:确保代码中正确关闭资源,防止连接耗尽。