欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > springboot配置mysql连接/配置mysql数据源连接池

springboot配置mysql连接/配置mysql数据源连接池

2025/2/8 21:58:37 来源:https://blog.csdn.net/abcnull/article/details/145502179  浏览:    关键词:springboot配置mysql连接/配置mysql数据源连接池

文章目录

  • 背景
  • 依赖
  • application.yml 配置
    • 单个 mysql 数据源(大多数业务项目中的场景)
    • 多个 mysql 数据源
  • 数据源 config 代码
    • 单个 mysql 数据源
    • 多个 mysql 数据源
  • 基本使用
  • 其他

背景

前置要求:
你使用 springboot 框架,希望配置 mysql 数据源,你可能使用 mybatis 或者 mybatis plus 框架

mysql 驱动:
mysql 官方驱动:MySQL Connector/J
第三方常用驱动:MariaDB JDBC 等,第三方驱动可能提供额外的功能或优化

mysql 官方没有提供专门的连接池实现:
但是推荐使用第三方连接池都可以于 MySQL Connector/J 配合使用,比如 HikariCP,Apache DBCP2,Tomcat JDBC Pool,C3P0

springboot 默认支持的 mysql 驱动:
springboot 默认使用的是 MySQL Connector/J,Spring Boot 会根据其版本自动选择合适的 MySQL Connector/J 版本,通常你无需手动指定,也就是说如果你有 spring-boot-starter-jdbc 依赖,那么就无需引入 Connector/J 的依赖了

springboot 默认支持连接池:
Spring Boot 默认使用 HikariCP 作为连接池

springboot 配置 mysql 数据源,本质就是指定用哪个 mysql 驱动,以及 mysql 的 host(连接,端口,用户,密码),以及要连那个库,配置好后,剩下的就是通过 mybatis 提供的 api 去操作你配置指向的数据源的数据了

依赖

如果有 spring-boot-starter-jdbc 依赖,它默认包含了对 MySQL Connector/J 的支持,所以再无需引入 mysql-connector-j 依赖了

application.yml 配置

单个 mysql 数据源(大多数业务项目中的场景)

如果你使用 Connector/J 这个 springboot 默认的 mysql 驱动,那么

spring:datasource:url: jdbc:mysql://localhost:3306/your_database_name?characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: your_usernamepassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Driver# 更复杂一点,配置连接池hikari:maximum-pool-size: 10 # 连接池最大连接数minimum-idle: 2       # 连接池最小空闲连接数idle-timeout: 30000   # 空闲连接超时时间(毫秒)max-lifetime: 1800000 # 连接最大存活时间(毫秒)connection-timeout: 30000 # 连接超时时间(毫秒)

多个 mysql 数据源

spring:datasource:primary: # 这个第一个数据源的名字,自己起url: jdbc:mysql://localhost:3306/userdbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driversecondary: # 这个第二个数据源的名字,自己起url: jdbc:mysql://localhost:3306/orderdbusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver

数据源 config 代码

单个 mysql 数据源

如果你配置单个 mysql 数据源,你完全不用去写 mysql 数据源的 configuration 的代码,无需指定数据源和 mapper 包的映射关系,即你只用配置 yml 就完事了,然后对应接口打上 @mapper 注解,就可以使用 mybatis 提供的 api 来进行数据库的操作,操作数据库 @mapper 标记的接口会自动使用 yml 中配置的唯一的数据源

多个 mysql 数据源

如果 application.yml 中有多个 mysql 数据源,那么你必须手写代码做 configuration,来指定哪个数据源和哪个 mapper 包建立绑定关系,这样指定的 mapper 包在做数据库操作时候才能知道要对哪个数据源做操作

@Configuration  
@EnableTransactionManagement  
@MapperScan(basePackages = "com.example.primary.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")  
public class PrimaryDataSourceConfig {  // 数据源@Primary  @Bean(name = "primaryDataSource")  @ConfigurationProperties(prefix = "spring.datasource.primary")  public DataSource primaryDataSource() {  return DataSourceBuilder.create().build();  }  // SqlSessionFactory@Primary  @Bean(name = "primarySqlSessionFactory")  public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {  SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();  sessionFactoryBean.setDataSource(dataSource);  return sessionFactoryBean.getObject();  }  // 事务管理@Primary  @Bean(name = "primaryTransactionManager") // 事务管理器public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {  return new DataSourceTransactionManager(dataSource);  }  
}  @Configuration  
@EnableTransactionManagement  
@MapperScan(basePackages = "com.example.secondary.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory")  
public class SecondaryDataSourceConfig {  // 数据源@Bean(name = "secondaryDataSource")  @ConfigurationProperties(prefix = "spring.datasource.secondary")  public DataSource secondaryDataSource() {  return DataSourceBuilder.create().build();  }  // SqlSessionFactory@Bean(name = "secondarySqlSessionFactory")  public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {  SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();  sessionFactoryBean.setDataSource(dataSource);  return sessionFactoryBean.getObject();  }  // 事务管理@Bean(name = "secondaryTransactionManager") // 事务管理器public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {  return new DataSourceTransactionManager(dataSource);  }  
}

多数据源,可以看到代码中会指定关联哪个 mapper 包

基本使用

当配置上 yml mysql 数据源后,并且 configuration 代码逻辑也写了(如果是多数据源),然后就可以正常使用 mybatis/mybatis plus 来进行常规的数据的 crud 了

其他

如果你仅仅使用了 mybatis,springboot 没有使用(即没有 yml),那怎么配置呢?

回答:你可以手动写 sqlSession 生成的代码,然后指定关联上哪个 mybatis-config.xml 文件,然后 mybatis-config.xml 中可以配置 mapper 包,以及配置 mysql 数据源和连接池,这样生成的 sqlSession 就可以操作数据库,后续可以利用 sqlsession 拿到 @mapper 标记的 mapper,然后再操作数据库

如果你的项目已经有一个 mysql 数据源了,你想加一个数据源,又不想变动 yml 该怎么做?

回答:你可以直接写第二个数据源的 configuration,然后其中含有 mysql 的连接信息

@Configuration  
@MapperScan(basePackages = "com.example.secondary.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory")  
public class SecondaryDataSourceConfig {  // 这里你可以通过编程方式设置数据源属性,或者从环境变量、系统属性等获取  private static final String DB_URL = "jdbc:mysql://localhost:3306/secondary_db";  private static final String USER = "root";  private static final String PASSWORD = "password";  private static final String DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver";  @Bean(name = "secondaryDataSource")  @ConfigurationProperties(prefix = "spring.datasource.secondary") // 注意:这里实际上不会从application.yml加载,因为我们手动配置了  public DataSource secondaryDataSource() {  return DataSourceBuilder.create()  .url(DB_URL)  .username(USER)  .password(PASSWORD)  .driverClassName(DRIVER_CLASS_NAME)  .build();  }  @Bean(name = "secondarySqlSessionFactory")  public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {  SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();  sessionFactory.setDataSource(dataSource);  sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/secondary/*.xml"));  return sessionFactory.getObject();  }  // 你还可以配置一个SqlSessionTemplate,但这里为了简洁省略了  
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com