当前位置:   article > 正文

Spring Boot + MyBatis + Druid + SQL Server 配置多数据源_druid 配置 sqlserver

druid 配置 sqlserver

版本配置

SpringBoot

2.4.11

Druid

1.1.17

sqljdbc4

4.0

MyBatis

2.1.1

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-parent</artifactId>
  9. <version>2.4.11</version>
  10. <relativePath/> <!-- lookup parent from repository -->
  11. </parent>
  12. <properties>
  13. <sqljdbc4.version>4.0</sqljdbc4.version>
  14. <druid-alibaba.version>1.1.17</druid-alibaba.version>
  15. <mybatis.version>2.1.1</mybatis.version>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>com.alibaba</groupId>
  20. <artifactId>druid-spring-boot-starter</artifactId>
  21. <version>${druid-alibaba.version}</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>com.microsoft.sqlserver</groupId>
  25. <artifactId>sqljdbc4</artifactId>
  26. <version>${sqljdbc4.version}</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.mybatis.spring.boot</groupId>
  30. <artifactId>mybatis-spring-boot-starter</artifactId>
  31. <version>${mybatis.version}</version>
  32. </dependency>
  33. </dependencies>
  34. </project>

配置数据源

目前有2个数据源,分别是master和slave。

第一步:配置application.yml

  1. spring:
  2. profiles:
  3. active: dev
  4. jackson:
  5. date-format: yyyy-MM-dd HH:mm:ss
  6. time-zone: GMT+8
  7. datasource:
  8. name: druid_ds
  9. type: com.alibaba.druid.pool.DruidDataSource
  10. druid:
  11. initial-size: 1
  12. min-idle: 1
  13. max-active: 10
  14. max-wait: 60000
  15. time-between-eviction-runs-millis: 60000
  16. min-evictable-idle-time-millis: 300000
  17. validation-query: SELECT 1
  18. test-while-idle: true
  19. test-on-borrow: false
  20. test-on-return: false
  21. pool-prepared-statements: false
  22. max-pool-prepared-statement-per-connection-size: 20
  23. filters: stat,slf4j # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
  24. filter:
  25. wall:
  26. config:
  27. multi-statement-allow: true
  28. none-base-statement-allow: true

druid的相同配置可以在application.yml中配置,通过active的值激活不同的配置文件,达到“开发环境”,“测试环境”,“生产环境”的差异性。

本文以dev(开发环境)作为配置值。

第二步:配置application-dev.yml

  1. server:
  2. port: 8305
  3. servlet:
  4. context-path: /
  5. spring:
  6. datasource:
  7. druid:
  8. master:
  9. driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
  10. url: jdbc:sqlserver://localhost:1433;DatabaseName=test_01
  11. username: sa
  12. password: 12345678
  13. slave:
  14. driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
  15. url: jdbc:sqlserver://localhost:1433;DatabaseName=test_02
  16. username: sa
  17. password: 12345678

master数据库名称为“test_01”,slave数据库名称为“test_02”。

第三步:配置master数据源

  1. import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
  2. import org.apache.ibatis.session.SqlSessionFactory;
  3. import org.mybatis.spring.SqlSessionFactoryBean;
  4. import org.mybatis.spring.annotation.MapperScan;
  5. import org.springframework.beans.factory.annotation.Qualifier;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.context.annotation.Primary;
  10. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  11. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  12. import javax.sql.DataSource;
  13. @Configuration
  14. @MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
  15. public class MasterDataSourceConfig {
  16. protected static final String PACKAGE = "com.test.domain.repository.master";
  17. protected static final String MAPPER_LOCATION = "classpath:orm/*.xml";
  18. @Bean(name = "masterDataSource")
  19. @ConfigurationProperties(prefix = "spring.datasource.druid.master")
  20. @Primary
  21. public DataSource masterDataSource() {
  22. return DruidDataSourceBuilder.create().build();
  23. }
  24. @Bean(name = "masterTransactionManager")
  25. @Primary
  26. public DataSourceTransactionManager masterTransactionManager() {
  27. return new DataSourceTransactionManager(masterDataSource());
  28. }
  29. @Bean(name = "masterSqlSessionFactory")
  30. @Primary
  31. public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource) throws Exception {
  32. final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  33. sessionFactory.setDataSource(masterDataSource);
  34. sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MasterDataSourceConfig.MAPPER_LOCATION));
  35. return sessionFactory.getObject();
  36. }
  37. }

第四步:配置slave数据源

  1. import com.alibaba.druid.pool.DruidDataSource;
  2. import org.apache.ibatis.session.SqlSessionFactory;
  3. import org.mybatis.spring.SqlSessionFactoryBean;
  4. import org.mybatis.spring.annotation.MapperScan;
  5. import org.springframework.beans.factory.annotation.Qualifier;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  10. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  11. import javax.sql.DataSource;
  12. @Configuration
  13. @MapperScan(basePackages = SlaveDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "slaveSqlSessionFactory")
  14. public class SlaveDataSourceConfig {
  15. public static final String PACKAGE = "com.test.domain.repository.slave";
  16. public static final String MAPPER_LOCATION = "classpath:orm/*.xml";
  17. @Bean(name = "slaveDataSource")
  18. @ConfigurationProperties(prefix = "spring.datasource.druid.slave")
  19. public DataSource slaveDataSource() {
  20. return new DruidDataSource();
  21. }
  22. @Bean(name = "slaveTransactionManager")
  23. public DataSourceTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource") DataSource slaveDataSource) {
  24. return new DataSourceTransactionManager(slaveDataSource);
  25. }
  26. @Bean(name = "slaveSqlSessionFactory")
  27. public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource slaveDataSource) throws Exception {
  28. final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
  29. sessionFactory.setDataSource(slaveDataSource);
  30. sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(SlaveDataSourceConfig.MAPPER_LOCATION));
  31. return sessionFactory.getObject();
  32. }
  33. }

第五步:配置service(业务)

5.1 master数据源

  1. @Service
  2. @RequiredArgsConstructor
  3. public class UserInfoService {
  4. private final UserInfoService userInfoService;
  5. @Transactional(value = "masterTransactionManager")
  6. public void insertUserInfo(UserInfo userInfo) {
  7. userInfoService.insertUserInfo(userInfo);
  8. }
  9. }

5.2 slave数据源

  1. import lombok.RequiredArgsConstructor;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.stereotype.Service;
  4. import org.springframework.transaction.annotation.Transactional;
  5. @Slf4j
  6. @Service
  7. @RequiredArgsConstructor
  8. public class ContactService {
  9. private final ContactMapper contactMapper;
  10. @Transactional(value = "slaveTransactionManager")
  11. public Contact getByOpenId(String openId) {
  12. return contactMapper.getByOpenId(openId);
  13. }
  14. }

通过 @Transactional选择相应的数据库

问题: @Transactional不生效

问题描述

起初,为了方便,我将master/slave对应的mapper放在一个目录下。

经验小结:将master与slave的dao层放在同一个目录时,例如都放在repository目录下。

项目运行时,总是报错Invalid object name 'xxxxxx',slave数据库没有选择成功。

方案1:指定执行环境数据库

https://blog.csdn.net/alone_in_/article/details/93848044

  1. <select id="getByOpenId" resultMap="baseContactMap">
  2. use test_02
  3. select * from contact where OpenID = #{openId}
  4. </select>

在mapper.xml文件中添加语句“use test_02”,指定数据库。

问题虽然得以解决,但是之前的配置就似乎没有必要了。进一步研究,得到方案2。

方案2:设定dao层

注意:master与slave的dao层是分开的。

将mater/slave对应的mapper层分别放在不同的目录里,运行程序后问题解决。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号