DataSourceConfig.java 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package com.crm.rely.backend.configuration;
  2. import com.crm.rely.backend.util.DynamicRoutingDataSource;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
  6. import org.springframework.boot.context.properties.ConfigurationProperties;
  7. import org.springframework.context.annotation.*;
  8. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  9. import javax.sql.DataSource;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. /**
  13. * @Author houn
  14. * @Date 2024/12/24 13:59
  15. * @PackageName:com.crm.manager.configuration
  16. * @ClassName: DynamicDataSourceConfig
  17. * @Description: TODO
  18. */
  19. @Slf4j
  20. @Configuration
  21. public class DataSourceConfig {
  22. @Value("${spring.dynamic-datasource.enable-auto-datasource-switch:false}")
  23. private boolean enableAutoDataSourceSwitch;
  24. @Lazy
  25. @Bean(name = "defaultDataSource")
  26. @ConfigurationProperties(prefix = "spring.datasource")
  27. public DataSource defaultDataSource() {
  28. return DataSourceBuilder.create().build();
  29. }
  30. @Bean(name = "masterDataSource")
  31. @ConfigurationProperties(prefix = "spring.dynamic-datasource.datasource.master")
  32. public DataSource masterDataSource() {
  33. return DataSourceBuilder.create().build();
  34. }
  35. @Bean(name = "slaveDataSource")
  36. @ConfigurationProperties(prefix = "spring.dynamic-datasource.datasource.slave")
  37. public DataSource slaveDataSource() {
  38. return DataSourceBuilder.create().build();
  39. }
  40. @Bean(name = "dynamicDataSource")
  41. @Primary
  42. @DependsOn({"defaultDataSource", "masterDataSource", "slaveDataSource"})
  43. public DataSource dynamicDataSource(DataSource defaultDataSource,
  44. DataSource masterDataSource,
  45. DataSource slaveDataSource) {
  46. log.info("Loading dynamic data sources...");
  47. log.info("Default DataSource: {}", defaultDataSource);
  48. log.info("Master DataSource: {}", masterDataSource);
  49. log.info("Slave DataSource: {}", slaveDataSource);
  50. if (!enableAutoDataSourceSwitch) {
  51. return defaultDataSource; // 返回默认数据源
  52. }
  53. Map<Object, Object> targetDataSources = new HashMap<>();
  54. targetDataSources.put("master", masterDataSource);
  55. targetDataSources.put("slave", slaveDataSource);
  56. AbstractRoutingDataSource dynamicDataSource = new DynamicRoutingDataSource();
  57. dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
  58. dynamicDataSource.setTargetDataSources(targetDataSources);
  59. return dynamicDataSource;
  60. }
  61. }