DataSourceConfigurer.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package com.zcxk.meterreadingsystemv2.dbs;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.mybatis.spring.SqlSessionFactoryBean;
  6. import org.mybatis.spring.SqlSessionTemplate;
  7. import org.mybatis.spring.boot.autoconfigure.MybatisProperties;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.beans.factory.annotation.Qualifier;
  12. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  13. import org.springframework.context.annotation.Bean;
  14. import org.springframework.context.annotation.Configuration;
  15. import org.springframework.core.env.Environment;
  16. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  17. import org.springframework.transaction.PlatformTransactionManager;
  18. import javax.sql.DataSource;
  19. import java.util.HashMap;
  20. import java.util.Map;
  21. /**
  22. * 数据源配置类,在tomcat启动时触发,在该类中生成多个数据源实例并将其注入到 ApplicationContext 中
  23. */
  24. @Slf4j
  25. @Configuration
  26. @EnableConfigurationProperties(MybatisProperties.class)
  27. public class DataSourceConfigurer {
  28. //自动注入环境类,用于获取配置文件的属性值
  29. @Autowired
  30. private Environment evn;
  31. private MybatisProperties mybatisProperties;
  32. public DataSourceConfigurer(MybatisProperties properties) {
  33. this.mybatisProperties = properties;
  34. }
  35. /**
  36. * 创建数据源对象
  37. * @param dbType 数据库类型
  38. * @return data source
  39. */
  40. private DruidDataSource createDataSource(String dbType) {
  41. //如果不指定数据库类型,则使用默认数据库连接
  42. String dbName = dbType.trim().isEmpty() ? "default" : dbType.trim();
  43. DruidDataSource dataSource = new DruidDataSource();
  44. String prefix = "db." + dbName +".";
  45. log.info("初始化数据库 dbName = {}",dbName );
  46. dataSource.setUrl(evn.getProperty( prefix + "url"));
  47. dataSource.setUsername(evn.getProperty( prefix + "username"));
  48. dataSource.setPassword(evn.getProperty( prefix + "password"));
  49. dataSource.setDriverClassName(evn.getProperty( prefix + "driver-class-name"));
  50. dataSource.setDbType(evn.getProperty( prefix + "type"));
  51. dataSource.setConnectionErrorRetryAttempts(1);
  52. dataSource.setBreakAfterAcquireFailure(true); // 请求失败之后中断
  53. dataSource.setMaxWait(5000);//请求失败后等待时间
  54. return dataSource;
  55. }
  56. /**
  57. * spring boot 启动后将自定义创建好的数据源对象放到TargetDataSources中用于后续的切换数据源用
  58. * (比如:DynamicDataSourceContextHolder.setDataSourceKey("dbMall"),手动切换到dbMall数据源
  59. * 同时指定默认数据源连接
  60. * @return 动态数据源对象
  61. */
  62. @Bean
  63. public DynamicDataSource dynamicDataSource() {
  64. //获取动态数据库的实例(单例方式)
  65. DynamicDataSource dynamicDataSource = DynamicDataSource.getInstance();
  66. //创建兴平数据库连接对象
  67. DruidDataSource xingpingDataSource = createDataSource("xingping");
  68. //创建新蒲新区数据库连接对象
  69. DruidDataSource xpDataSource = createDataSource("xp");
  70. //创建萝北数据库连接对象
  71. DruidDataSource lbDataSource = createDataSource("lb");
  72. //创建绥滨数据库连接对象
  73. DruidDataSource suibinDataSource = createDataSource("suibin");
  74. //创建同江数据库连接对象
  75. //DruidDataSource tongjiangDataSource = createDataSource("tongjiang");
  76. //创建绥滨数据库连接对象
  77. DruidDataSource jlDataSource = createDataSource("jl");
  78. //创建绥阳数据库连接对象
  79. DruidDataSource suiyangDataSource = createDataSource("suiyang");
  80. //创建巴里坤数据库连接对象
  81. //DruidDataSource balikunDataSource = createDataSource("balikun");
  82. //创建泾阳数据库连接对象
  83. //DruidDataSource jingyangDataSource = createDataSource("jingyang");
  84. //创建泾阳数据库连接对象
  85. //DruidDataSource huichuanDataSource = createDataSource("huichuan");
  86. //创建通用数据库连接对象
  87. DruidDataSource commonDataSource = createDataSource("common");
  88. //创建物联网云平台数据库连接对象
  89. DruidDataSource smartCityDataSource = createDataSource("smart-city");
  90. Map<Object,Object> map = new HashMap<>();
  91. //自定义数据源key值,将创建好的数据源对象,赋值到targetDataSources中,用于切换数据源时指定对应key即可切换
  92. map.put("xingping", xingpingDataSource);
  93. map.put("xp", xpDataSource);
  94. map.put("lb", lbDataSource);
  95. map.put("suibin", suibinDataSource);
  96. //map.put("tongjiang", tongjiangDataSource);
  97. map.put("suiyang", suiyangDataSource);
  98. //map.put("balikun", balikunDataSource);
  99. //map.put("jingyang", jingyangDataSource);
  100. //map.put("huichuan", huichuanDataSource);
  101. map.put("common", commonDataSource);
  102. map.put("jl", jlDataSource);
  103. map.put("smart-city", smartCityDataSource);
  104. dynamicDataSource.setTargetDataSources(map);
  105. //设置默认数据源
  106. dynamicDataSource.setDefaultTargetDataSource(smartCityDataSource);
  107. return dynamicDataSource;
  108. }
  109. /**
  110. * 配置mybatis的sqlSession连接动态数据源
  111. * @param dynamicDataSource
  112. * @return
  113. * @throws Exception
  114. */
  115. @Bean
  116. public SqlSessionFactory sqlSessionFactory(
  117. @Qualifier("dynamicDataSource") DataSource dynamicDataSource)
  118. throws Exception {
  119. SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
  120. bean.setDataSource(dynamicDataSource);
  121. bean.setMapperLocations(mybatisProperties.resolveMapperLocations());
  122. bean.setTypeAliasesPackage(mybatisProperties.getTypeAliasesPackage());
  123. bean.setConfiguration(mybatisProperties.getConfiguration());
  124. return bean.getObject();
  125. }
  126. @Bean(name = "sqlSessionTemplate")
  127. public SqlSessionTemplate sqlSessionTemplate(
  128. @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory)
  129. throws Exception {
  130. return new SqlSessionTemplate(sqlSessionFactory);
  131. }
  132. /**
  133. * 将动态数据源添加到事务管理器中,并生成新的bean
  134. * @return the platform transaction manager
  135. */
  136. @Bean
  137. public PlatformTransactionManager transactionManager() {
  138. return new DataSourceTransactionManager(dynamicDataSource());
  139. }
  140. }