专栏首页犀牛饲养员的技术笔记springboot多数据源配置和使用

springboot多数据源配置和使用

yml配置数据源

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

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的配置类,

@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来验证一下。

@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);
    }
}

多数据源下的事务问题

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

    @Transactional(value = "db1TransactionManager",rollbackFor = Exception.class)
    @Override
    public void run(Long startID, Long endID, boolean isCheck) {
        ...

本文分享自微信公众号 - 犀牛饲养员的技术笔记(coder_start_up),作者:siwuxie18

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ES系列之一文带你避开日期类型存在的坑

    时间相关的字段是ElasticsSearch(以下简称ES)最常用的字段了,几乎所有的索引应用场景都会有时间字段,一般用于基于时间范围的搜索,聚合等场景。但是由...

    用户7634691
  • ES主分片和副本数据大小不一样的情况

    很多认为Elasticsearch(以下简称ES),同一个分片的主分片和副本分片文档数量肯定是样的,数据大小也是一样的。

    用户7634691
  • kafka发送客户端在高并发场景下如何保证不频繁GC的

    最近看kafka源码,着实被它的客户端缓冲池技术优雅到了。忍不住要写篇文章赞美一下(哈哈)。

    用户7634691
  • 那些年我们写过的T-SQL(中篇)

    中篇的重点在于,在复杂情况下使用表表达式的查询,尤其是公用表表达式(CTE),也就是非常方便的WITH AS XXX的应用,在SQL代码,这种方式至少可以提高一...

    用户1216676
  • 基于注解的SpringAOP源码解析(二)

    在上篇文章中我们搭建了一个阅读源码的demo工程,然后简单介绍了一下@EnableAspectJAutoProxy注解,这个注解最重要的功能就是为向Spring...

    Java学习录
  • Spring boot项目集成Sharding Jdbc

    jdk:1.8 framework: spring boot, sharding jdbc database: MySQL

    Dylan Liu
  • 假爱豆真AI,中国女子组合SNH48构建智能3D替身

    中国女孩偶像组合SNH48最新发布圣诞音乐视频,六位最受欢迎的明星一起唱歌和跳舞,值得注意的是,这六人都有假“替身”。

    新智元
  • 百度熊掌号 API 资源 php 主动推送提交教程

    百度熊掌号是现在很热门的平台,广大站长纷纷加入熊掌号的队列中。前面写了WordPress 百度熊掌号自动推送插件安装使用教程,如果是网站运行很久了才加入,会有很...

    魏艾斯博客www.vpsss.net
  • Cypress学习5-table表格元素(别名使用Aliasing)

    页面上有些元素定位路径比较复杂,可以先定位到该元素使用别名,通过这个别名去操作元素,这样看起来简洁一些。

    上海-悠悠
  • ShardingSphere之Sharding-JDBC与SpringBoot的集成

    飞狗

扫码关注云+社区

领取腾讯云代金券