开发者

若依框架多数据源切换方式

开发者 https://www.devze.com 2024-01-24 10:24 出处:网络 作者: Code quotient
目录前言使用1.首先yml里要配置正确的主从库数据源2.在DataSourceType中http://www.devze.com配置从库3.配置多数据源信息再DruidConfig里总结前言
目录
  • 前言
  • 使用
    • 1.首先yml里要配置正确的主从库数据源
    • 2.在DataSourceType中http://www.devze.com配置从库
    • 3.配置多数据源信息再DruidConfig里
  • 总结

    前言

    在开发过程中时常遇到需要使用多个数据库的情况,读写分离也好还是不同数据库也好都需要配置多数据源在需要的时候能够切换到对应的数据源。

    若依框架自带的多数据源配置切换即可实现。

    使用方法如下:

    使用

    1.首先yml里要配置正确的主从库数据源

    其中的enabled:true 代表的是是否开启从库,默认是关闭的需要改成true。

    # 数据源配置
    spring:
        datasource:
            type: com.alibaba.druid.pool.DruidDataSource
            driverClassName: com.mysql.cj.jdbc.Driver
            druid:
                # 主库数据源
                master:
                    url: jdbc:mysql://****:3306/tablename?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                    username: *****
                    password: *****
                # 从库数据源
                slave:
                    # 从数据源开关/默认关闭js
                    enabled: true
                    url: jdbc:mysql://******:3306/tablename?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                    username: *****
                    password: ******
                # 初始连接数
                initialSize: 5
                # 最小连接池数量
                minIdle: 10
                # 最大连接池数量
                maxActive: 20
                # 配置获取连接等待超时的时间
                maxWait: 60000
               www.devze.com # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
                timeBetweenEvictionRunsMillis: 60000
                # 配置一个连接在池中最小生存的时间,单位是毫秒
                minEvictableIdleTimeMillis: 300000
                # 配置一个连接在池中最大生存的时间,单位是毫秒
                maxEvictableIdleTimeMillis: 900000
                # 配置检测连接是否有效
                validationQuery: SELECT 1 FROM DUAL
                testWhileIdle: true
                testOnBorrow: false
                testOnReturn: false
                webStatFilter:
                    enabled: true
                statViewServlet:
                    enabled: true
                    # 设置白名单,不填则允许所有访问
                    allow:
                    url-pattern: /druid/*
                    # 控制台管理用户名和密码
                    login-username: ruoyi
                    login-password: 123456
                filter:
                    stat:
                        enabled: true
                        # 慢SQL记录
                        log-slow-sql: true
                        slow-sql-millis: 1000
                        merge-sql: true
                    wall:
                        config:
                            multi-statement-allow: true

    2.在DataSourceType中配置从库

    若有多个从库就添加一个 eg: //从库2   SLAVE2

    package com.ruoyi.common.enums;
     
    /**
     * 数据源
     * 
     * @author ruoyi
     */
    public enum DataSourceType
    {
        /**
         * 主库
         */
        MASTER,
     
        /**
         * 从库
         */
        SLAVE
    }

    3.配置多数据源信息再DruidConfig里

    多一个数据源就要多一个配置

    @Configuration
    public class DruidConfig
    {
        @Bean
        @ConfigurationProperties("spring.datasource.druid.master")
        public DataSource masterDataSource(DruidProperties druidProperties)
        {
            DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
            return druidProperties.dataSource(dataSource);
        }
     
        @Bean
        @ConfigurationProperties("spring.datasource.druid.slave")
        @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
        public DataSource slaveDataSource(DruidProperties druidProperties)
        {
           js DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
            return druidProperties.dataSource(dataSource);
        }
     
        @Bean(name = "dynamicDataSource")
        @Primary
        public DynamicDataSource dataSource(DataSource masterDataSource)
        {
            Map<Object, Object> targetDataSources = new HashMap<>();
            targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
            setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
            return new DynamicDataSource(masterDataSource, targetDataSources);
        }
     
        /**
         * 设置数据源
         *
         * @param targetDataSources 备选数据源集合
         * @param sourceName 数据源名称
         * @param beanName bean名称
         */
        public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
        {
            try
            {
                DataSource dataSource = SpringUtils.getBean(beanName);
                targetDataSources.put(sourceName, dataSource);
            }
            catch (Exception e)
            {
            }
        }

    以上信息配置完成后即可在需要切换数据源的时候在对应的mapper或service实现类上添加

    @DataSource(value = DataSourceType.MASTER) 注解

    eg:

    若依框架多数据源切换方式

        @DataSource(value = DataSourceType.SLAVE)//切换数据源
        @Override
        public AJAXResult selectNowUserList() {
            List<SysUser> sysUsers = userMapper.selectUserList(new SysUser());
            return AjaxResult.success(sysUsers);
        }

    以上就是若依框架自带的多数据源切换配置操作,其原理就是AbstractRoutingDataSource的源码里通过determinejsCurrentLookupKey 这个方法返回的key去resolvedDataSources里面找对应的DataSource,之后更新一期手动配置一套多数据切换。

    总结

    这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号