文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

springboot添加多数据源的方法(笔记)

2023-09-05 16:57

关注

Spring Boot可以通过配置多个数据源来支持多数据源访问,以下是一个基本的多数据源配置实例:

添加多数据源的配置类

创建一个配置类来配置多个数据源,可以使用@Configuration和@Primary注解来标识主数据源,示例代码如下:

@Configurationpublic class DataSourceConfig {     @Bean(name = "primaryDataSource")    @Primary    @ConfigurationProperties(prefix = "spring.datasource.primary")    public DataSource primaryDataSource() {        return DataSourceBuilder.create().build();    }     @Bean(name = "secondaryDataSource")    @ConfigurationProperties(prefix = "spring.datasource.secondary")    public DataSource secondaryDataSource() {        return DataSourceBuilder.create().build();    }}

在这个配置类中,我们定义了两个数据源,一个是主数据源,一个是次要数据源。我们使用@ConfigurationProperties注解来设置每个数据源的配置参数。

在application.yml中添加数据源配置

添加application.yml配置文件,并在文件中添加多个数据源的配置信息,例如:

spring:  datasource:    primary:      driver-class-name: com.mysql.jdbc.Driver      url: jdbc:mysql://localhost:3306/test1      username: root      password: root    secondary:      driver-class-name: com.mysql.jdbc.Driver      url: jdbc:mysql://localhost:3306/test2      username: root      password: root

我们使用了Spring Boot的默认配置规则,通过指定数据源的名称和属性前缀来配置每个数据源。

配置JdbcTemplate来访问多个数据源

现在我们已经定义了两个数据源,我们需要配置JdbcTemplate来访问它们。我们可以在使用JdbcTemplate的每个方法中指定要使用的数据源,示例代码如下:

@Repositorypublic class UserRepository {     @Autowired    @Qualifier("primaryDataSource")    private DataSource primaryDataSource;     @Autowired    @Qualifier("secondaryDataSource")    private DataSource secondaryDataSource;     public List<User> getUsersFromPrimary() {        JdbcTemplate jdbcTemplate = new JdbcTemplate(primaryDataSource);        List<User> users = jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper(User.class));        return users;    }     public List<User> getUsersFromSecondary() {        JdbcTemplate jdbcTemplate = new JdbcTemplate(secondaryDataSource);        List<User> users = jdbcTemplate.query("SELECT * FROM users", new BeanPropertyRowMapper(User.class));        return users;    }}

我们在注入JdbcTemplate之前使用@Autowired注解将每个数据源注入到存储库类中。然后,我们可以在每个方法中使用JdbcTemplate来访问不同的数据源。

这是一个基本的多数据源配置实例,你可以在此基础上进一步调整以满足你的具体需求。

如果你使用的是MyBatis框架,你可以使用MyBatis的动态数据源来实现多数据源配置,具体步骤如下

定义数据源配置类

首先,你需要定义一个数据源配置类来读取和解析配置文件,然后根据配置创建数据源并将其添加到数据源列表中,示例代码如下:

@Configurationpublic class DataSourceConfig {    @Value("${spring.datasource.type}")    private Class<? extends DataSource> dataSourceType;    @Bean(name = "masterDataSource")    @ConfigurationProperties(prefix = "spring.datasource.master")    public DataSource masterDataSource() {        return DataSourceBuilder.create().type(dataSourceType).build();    }    @Bean(name = "slaveDataSource")    @ConfigurationProperties(prefix = "spring.datasource.slave")    public DataSource slaveDataSource() {        return DataSourceBuilder.create().type(dataSourceType).build();    }    @Bean(name = "dynamicDataSource")    public DataSource dynamicDataSource() {        DynamicDataSource dynamicDataSource = new DynamicDataSource();        Map<Object, Object> targetDataSources = new HashMap<>();        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource());        targetDataSources.put(DataSourceType.SLAVE.name(), slaveDataSource());        dynamicDataSource.setTargetDataSources(targetDataSources);        dynamicDataSource.setDefaultTargetDataSource(masterDataSource());        return dynamicDataSource;    }}

在这个配置类中,我们使用@ConfigurationProperties注解来读取每个数据源的配置信息,然后使用DataSourceBuilder创建数据源对象。接着,我们使用DynamicDataSource类来管理多个数据源,将所有数据源添加到targetDataSources中并设置默认数据源为masterDataSource。

实现动态数据源

接下来,你需要实现一个动态数据源,它可以根据需要选择不同的数据源,示例代码如下:

public class DynamicDataSource extends AbstractRoutingDataSource {    @Override    protected Object determineCurrentLookupKey() {        return DynamicDataSourceContextHolder.getDataSourceType();    }}

我们继承了AbstractRoutingDataSource类,覆盖了它的determineCurrentLookupKey()方法来获取当前线程所需的数据源类型,并返回数据源名称。

实现数据源上下文

最后,你需要创建一个数据源上下文来保存当前线程所需的数据源类型,示例代码如下:

public class DynamicDataSourceContextHolder {    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();    public static void setDataSourceType(String dataSourceType) {        contextHolder.set(dataSourceType);    }    public static String getDataSourceType() {        return contextHolder.get();    }    public static void clearDataSourceType() {        contextHolder.remove();    }}

我们使用了ThreadLocal来保存当前线程所需的数据源类型。你可以在需要访问不同数据源的方法中调用setDataSourceType()方法来设置当前线程所需的数据源类型,调用clearDataSourceType()方法来清除上下文。

最后,在你的MyBatis配置文件中,你可以使用${}占位符引用定义的动态数据源,示例代码如下:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    <property name="dataSource" ref="dynamicDataSource"/>    <property name="typeAliasesPackage" value="com.example.model"/>bean>

我们将MyBatis的SqlSessionFactoryBean中的dataSource属性设置为定义的动态数据源dynamicDataSource即可。

切换数据源

最后,你可以在需要访问不同数据源的方法中调用DynamicDataSourceContextHolder.setDataSourceType()方法来设置当前线程所需的数据源类型。例如,你可以定义一个注解来标识使用哪个数据源,然后在方法上加上这个注解即可自动切换数据源。

@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DataSource {    DataSourceType value() default DataSourceType.MASTER;}@Aspect@Componentpublic class DynamicDataSourceAspect {    @Pointcut("@annotation(com.example.annotation.DataSource)")    public void dataSourcePointcut() {    }    @Before("dataSourcePointcut()")    public void before(JoinPoint joinPoint) {        DataSource dataSource = getDataSource(joinPoint);        if (dataSource != null) {            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());        }    }    @After("dataSourcePointcut()")    public void after(JoinPoint joinPoint) {        DynamicDataSourceContextHolder.clearDataSourceType();    }    private DataSource getDataSource(JoinPoint joinPoint) {        MethodSignature signature = (MethodSignature) joinPoint.getSignature();        Method method = signature.getMethod();        if (method.isAnnotationPresent(DataSource.class)) {            return method.getAnnotation(DataSource.class);        }        return null;    }}

在这个例子中,我们定义了一个@DataSource注解来标识使用哪个数据源,然后使用AOP来自动切换数据源。在DynamicDataSourceAspect类中,我们使用@Pointcut注解来定义切点,然后使用@Before和@After注解来分别在方法调用前和方法调用后切换数据源。在切换数据源时,我们可以通过getDataSource()方法获取方法上的@DataSource注解,并使用注解中定义的数据源类型来设置当前线程所需的数据源类型。

来源地址:https://blog.csdn.net/qq_38220908/article/details/129062702

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯