实现SpringBoot的多数据源配置

【场景】

  1. 当业务数据量达到了一定程度,DBA 需要合理配置数据库资源。即配置主库的机器高配置,把核心高频的数据放在主库上;把次要的数据放在从库,低配置。
    –(引自 https://www.cnblogs.com/Alandre/p/6611813.html 泥瓦匠BYSocket 大神博客)
  2. 实现读写分离(详见

https://www.cnblogs.com/surge/p/3582248.html


【实现步骤(以renren-security为例)】

  1. 在yml中配置多数据源
    在这里插入图片描述注意此处的 first 和 second,后续配置数据源的名称要与此处名称一致。
    2.配置多数据源的标志注解@DataSource,其使用方法是在具体进行业务编码的时候,通过@DataSource(name = “first”)来实现数据源的切换,此处的 first 是在 yml 文件中定义的数据库名称。
    在这里插入图片描述
    这里重点介绍下SpringBoot的3个注解:
    Java注解之 @Target、@Retention、@Documented简介
    另外补充2个注解:

@Inherited注解 功能:允许子类继承父类中的注解。
@interface意思是声明一个注解,方法名对应参数名,返回值类型对应参数类型。

3.编写DynamicDataSource类,该类需要继承AbstractRoutingDataSource,在Spring容器加载的时候,就注册(设置)数据源,其中,AbstractRoutingDataSource重写了determineCurrentLookupKey()方法,该方法从ThreadLocal(当前

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在Spring Boot中配置多个数据可以使用以下步骤: 1. 配置数据 ```java @Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } } ``` 2. 配置事务管理器 ```java @Configuration @EnableTransactionManagement public class TransactionConfig { @Autowired private DataSource primaryDataSource; @Autowired private DataSource secondaryDataSource; @Bean(name = "primaryTransactionManager") public PlatformTransactionManager primaryTransactionManager() { return new DataSourceTransactionManager(primaryDataSource); } @Bean(name = "secondaryTransactionManager") public PlatformTransactionManager secondaryTransactionManager() { return new DataSourceTransactionManager(secondaryDataSource); } @Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } } ``` 3. 配置JPA ```java @Configuration @EnableJpaRepositories( entityManagerFactoryRef = "primaryEntityManagerFactory", transactionManagerRef = "primaryTransactionManager", basePackages = {"com.example.primary.repository"}) public class PrimaryDataSourceConfig { @Autowired private Environment env; @Primary @Bean(name = "primaryDataSource") public DataSource primaryDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getProperty("spring.datasource.primary.driverClassName")); dataSource.setUrl(env.getProperty("spring.datasource.primary.url")); dataSource.setUsername(env.getProperty("spring.datasource.primary.username")); dataSource.setPassword(env.getProperty("spring.datasource.primary.password")); return dataSource; } @Primary @Bean(name = "primaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.example.primary.entity") .persistenceUnit("primary") .build(); } @Primary @Bean(name = "primaryTransactionManager") public PlatformTransactionManager primaryTransactionManager( @Qualifier("primaryEntityManagerFactory") EntityManagerFactory primaryEntityManagerFactory) { return new JpaTransactionManager(primaryEntityManagerFactory); } } @Configuration @EnableJpaRepositories( entityManagerFactoryRef = "secondaryEntityManagerFactory", transactionManagerRef = "secondaryTransactionManager", basePackages = {"com.example.secondary.repository"}) public class SecondaryDataSourceConfig { @Autowired private Environment env; @Bean(name = "secondaryDataSource") public DataSource secondaryDataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getProperty("spring.datasource.secondary.driverClassName")); dataSource.setUrl(env.getProperty("spring.datasource.secondary.url")); dataSource.setUsername(env.getProperty("spring.datasource.secondary.username")); dataSource.setPassword(env.getProperty("spring.datasource.secondary.password")); return dataSource; } @Bean(name = "secondaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("com.example.secondary.entity") .persistenceUnit("secondary") .build(); } @Bean(name = "secondaryTransactionManager") public PlatformTransactionManager secondaryTransactionManager( @Qualifier("secondaryEntityManagerFactory") EntityManagerFactory secondaryEntityManagerFactory) { return new JpaTransactionManager(secondaryEntityManagerFactory); } } ``` 4. 配置application.properties ```properties spring.datasource.primary.url=jdbc:mysql://localhost:3306/primary_db spring.datasource.primary.username=root spring.datasource.primary.password=root spring.datasource.primary.driverClassName=com.mysql.jdbc.Driver spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondary_db spring.datasource.secondary.username=root spring.datasource.secondary.password=root spring.datasource.secondary.driverClassName=com.mysql.jdbc.Driver ``` 完成以上步骤后,就可以在代码中使用多个数据了。例如: ```java @Service public class UserService { @Autowired @Qualifier("primaryJdbcTemplate") private JdbcTemplate primaryJdbcTemplate; @Autowired @Qualifier("secondaryJdbcTemplate") private JdbcTemplate secondaryJdbcTemplate; public void addUser(User user) { String sql = "INSERT INTO user (username, password) VALUES (?, ?)"; primaryJdbcTemplate.update(sql, user.getUsername(), user.getPassword()); } public List<User> getAllUsers() { String sql = "SELECT * FROM user"; List<User> users = secondaryJdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class)); return users; } } ``` 以上就是使用Spring Boot实现数据配置的代码实现
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值