前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot多数据源配置和使用

springboot多数据源配置和使用

作者头像
用户7634691
发布2020-08-10 16:20:42
2.6K0
发布2020-08-10 16:20:42
举报

yml配置数据源

这个直接把多个数据库连接信息写上即可,用spring.datasource属性进行配置,如下:

代码语言:javascript
复制
spring:
  profiles: dev
  datasource:
    test1:
      jdbc-url: jdbc:mysql://10.204.58.202:3306/uniorder_sit1?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
      username: uniorder
      password: uniorder123.com
      type: com.alibaba.druid.pool.DruidDataSource
    test2:
      jdbc-url: jdbc:mysql://10.204.53.175:3306/ishare?allowMultiQueries=true
      username: pay
      password: pay123.com
      type: com.alibaba.druid.pool.DruidDataSource

注意spring boot 2.x之后要用 jdbc-url,不能用jdbc或者url。因为在2.x之后 spring boot把默认的JDBC连接池由 tomcat 换成了 HikariCP,后者只有jdbcUrl属性。

有兴趣的可以看看官方的说明,

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-configure-a-datasource

type 是指定Resource所属的Java类名。

config配置类

比如说有两个数据源,我们最好是组织两个配置类,这样结构清晰一些。

test1的配置类,

代码语言:javascript
复制
@Configuration
@MapperScan(basePackages = "com.example.dao.test1", sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class Test1DBConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.test1")
    public DataSource db1DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/test1/**/*.xml"));
        return bean.getObject();
    }

    @Bean
    public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

解释一下,

@Configuration用于定义配置类,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法启动时被扫描来构建 bean 定义,初始化 spring 容器。相当于以前的 xml 配置 bean 的方式。

@MapperScan时 mybatis 的注解,用于告诉spring去扫描相关的package去发现相应的接口并利用mybatis对其做实现。这个注解可以加到配置类上,也可以加到spring boot 启动类上。这个package路径下放的就是mybatis生成的mapper接口类。

test2的配置类类似,这里不贴出来了。

mybatis接口和实现

mybatis的接口,实体定义,以及xml的sql实现,都可以用插件直接生成,这里就不详述了。

测试

我们可以写一个测试的controller来验证一下。

代码语言:javascript
复制
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    Test1DAO test1DAO;
    @Autowired
    Test2DAO test2DAO;

    @GetMapping("/test1")
    public String test1(){
        User user = new User();
        test1DAO.insert(user);
    }

    @GetMapping("/test2")
    public String test2(){
        User user = new User();
        test2DAO.insert(user);
    }
}

多数据源下的事务问题

多数据源下使用事务时,需要在注解上明确是哪个数据源,类似下面这样,否则会报找不到事务管理实例的错误。

代码语言:javascript
复制
    @Transactional(value = "db1TransactionManager",rollbackFor = Exception.class)
    @Override
    public void run(Long startID, Long endID, boolean isCheck) {
        ...
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 犀牛的技术笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • yml配置数据源
  • config配置类
  • mybatis接口和实现
  • 测试
  • 多数据源下的事务问题
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档