Mybatis DataSource(数据源)

271 阅读3分钟

MyBatis 的 数据源(DataSource) 是管理数据库连接的核心模块,负责连接的创建、复用和释放。合理配置数据源对应用性能至关重要。

一、数据源的作用

  1. 连接管理:高效创建和释放数据库连接,避免频繁建立连接的开销。
  2. 连接复用:通过连接池复用空闲连接,提升性能。
  3. 资源控制:限制最大连接数,防止数据库过载。

二、MyBatis 支持的数据源类型

MyBatis 内置三种数据源,并支持集成第三方连接池:

类型特点适用场景
UNPOOLED非池化数据源,每次请求新建连接,用后关闭。简单测试、低并发场景。
POOLEDMyBatis 自带连接池,复用空闲连接。中小型生产环境,无需第三方依赖。
JNDI从 Java EE 容器(如 Tomcat)获取数据源。容器管理的生产环境(如 Tomcat)。
第三方连接池HikariCPDruidC3P0,性能更优,功能丰富。高并发、高性能要求的场景。

三、数据源的配置方式

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 数据源是数据库连接管理的核心,合理选择和配置数据源可显著提升应用性能。关键点包括:

  1. 按需选择类型:简单场景用内置 POOLED,高并发用 HikariCP 或 Druid。
  2. 优化连接池参数:根据并发量和数据库负载调整连接数及超时时间。
  3. 集成监控工具:通过 Druid 或 HikariCP 的监控功能,实时诊断连接池状态。
  4. 避免资源泄漏:确保代码中正确关闭资源,防止连接耗尽。