DynamicDataSourceRegister.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package com.util.BasesSource;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import com.alibaba.druid.pool.DruidDataSourceFactory;
  4. import org.springframework.beans.MutablePropertyValues;
  5. import org.springframework.beans.factory.support.BeanDefinitionRegistry;
  6. import org.springframework.beans.factory.support.GenericBeanDefinition;
  7. import org.springframework.context.EnvironmentAware;
  8. import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
  9. import org.springframework.core.env.Environment;
  10. import org.springframework.core.type.AnnotationMetadata;
  11. import org.springframework.stereotype.Component;
  12. import javax.sql.DataSource;
  13. import java.sql.*;
  14. import java.util.HashMap;
  15. import java.util.Map;
  16. /**
  17. * @Author caiChaoqi
  18. * @Date 2018-06-23
  19. * @Description 注册动态数据源
  20. * 初始化数据源和提供了执行动态切换数据源的工具类
  21. * EnvironmentAware(获取配置文件配置的属性值)
  22. */
  23. @Component
  24. public class DynamicDataSourceRegister implements ImportBeanDefinitionRegistrar, EnvironmentAware {
  25. //指定默认数据源(springboot2.0默认数据源是hikari如何想使用其他数据源可以自己配置)
  26. private static final String DATASOURCE_TYPE_DEFAULT = "com.alibaba.druid.pool.DruidDataSource";
  27. //默认数据源
  28. private DataSource defaultDataSource;
  29. //用户自定义数据源
  30. private Map<String, DataSource> slaveDataSources = new HashMap<>();
  31. Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
  32. public DataSource getDefaultDataSource() {
  33. return defaultDataSource;
  34. }
  35. public void setDefaultDataSource(DataSource defaultDataSource) {
  36. this.defaultDataSource = defaultDataSource;
  37. }
  38. public Map<String, DataSource> getSlaveDataSources() {
  39. return slaveDataSources;
  40. }
  41. public void setSlaveDataSources(Map<String, DataSource> slaveDataSources) {
  42. this.slaveDataSources = slaveDataSources;
  43. }
  44. public Map<Object, Object> getTargetDataSources() {
  45. return targetDataSources;
  46. }
  47. public void setTargetDataSources(Map<Object, Object> targetDataSources) {
  48. this.targetDataSources = targetDataSources;
  49. }
  50. // 读取主数据源
  51. Map<String, Object> dsDeMap = new HashMap<>();
  52. @Override
  53. public void setEnvironment(Environment environment) {
  54. initDefaultDataSource(environment);
  55. initslaveDataSources();
  56. }
  57. private void initDefaultDataSource(Environment env) {
  58. // 读取主数据源
  59. dsDeMap = new HashMap<>();
  60. dsDeMap.put("driver", env.getProperty("spring.datasource.driver-class-name"));
  61. dsDeMap.put("url", env.getProperty("spring.datasource.url"));
  62. dsDeMap.put("username", env.getProperty("spring.datasource.username"));
  63. dsDeMap.put("password", env.getProperty("spring.datasource.password"));
  64. System.out.println("主数据源:" + dsDeMap);
  65. defaultDataSource = buildDataSource(dsDeMap);
  66. }
  67. private void initslaveDataSources(){
  68. // 读取配置文件获取更多数据源
  69. // String dsPrefixs = env.getProperty("slave.datasource.names");
  70. // for (String dsPrefix : dsPrefixs.split(",")) {
  71. // // 多个数据源
  72. // Map<String, Object> dsMap = new HashMap<>();
  73. // dsMap.put("driver", env.getProperty("slave.datasource." + dsPrefix + ".driver-class-name"));
  74. // dsMap.put("url", env.getProperty("slave.datasource." + dsPrefix + ".url"));
  75. // dsMap.put("username", env.getProperty("slave.datasource." + dsPrefix + ".username"));
  76. // dsMap.put("password", env.getProperty("slave.datasource." + dsPrefix + ".password"));
  77. // DataSource ds = buildDataSource(dsMap);
  78. // System.out.println("MAP" + dsMap);
  79. // slaveDataSources.put(dsPrefix, ds);
  80. // }
  81. String driver = String.valueOf(dsDeMap.get("driver"));
  82. String url = String.valueOf(dsDeMap.get("url"));
  83. String userName = String.valueOf(dsDeMap.get("username"));
  84. String passWord = String.valueOf(dsDeMap.get("password"));
  85. String sql = "select id, bases_name, addrass, port, database_type, data_name, user_name, pass_word from bi_databases";
  86. Connection conn = null;
  87. PreparedStatement pstmt = null;
  88. ResultSet rs = null;//定义存放查询结果的结果集
  89. try {
  90. Class.forName(driver);
  91. conn = DriverManager.getConnection(url, userName, passWord);
  92. pstmt = conn.prepareStatement(sql);
  93. rs = pstmt.executeQuery();//运行查询操作
  94. System.out.println();
  95. while(rs.next()){
  96. System.out.println("id:" +rs.getString("id"));
  97. // 多个数据源
  98. Map<String, Object> dsMap = new HashMap<>();
  99. String dei = rs.getString("database_type");
  100. dsMap.put("driver", "oracle.jdbc.driver.OracleDriver");
  101. dsMap.put("url", "jdbc:" + "oracle" + ":thin:@"+ rs.getString("addrass") + ":"
  102. + rs.getString("port") + ":" + rs.getString("data_name"));
  103. dsMap.put("username", rs.getString("user_name"));
  104. dsMap.put("password", rs.getString("pass_word"));
  105. DataSource ds = buildDataSource(dsMap);
  106. slaveDataSources.put(rs.getString("id"), ds);
  107. }
  108. } catch (ClassNotFoundException e) {
  109. // TODO Auto-generated catch block
  110. e.printStackTrace();
  111. } catch (SQLException e) {
  112. // TODO Auto-generated catch block
  113. e.printStackTrace();
  114. }finally {
  115. try {
  116. rs.close();
  117. pstmt.close();
  118. conn.close();
  119. } catch (SQLException e) {
  120. e.printStackTrace();
  121. }
  122. }
  123. }
  124. @Override
  125. public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
  126. //添加默认数据源
  127. targetDataSources.put("dataSource", this.defaultDataSource);
  128. DynamicDataSourceContextHolder.dataSourceIds.add("dataSource");
  129. //添加其他数据源
  130. targetDataSources.putAll(slaveDataSources);
  131. for (String key : slaveDataSources.keySet()) {
  132. DynamicDataSourceContextHolder.dataSourceIds.add(key);
  133. }
  134. //创建DynamicDataSource
  135. GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
  136. beanDefinition.setBeanClass(DynamicDataSource.class);
  137. beanDefinition.setSynthetic(true);
  138. MutablePropertyValues mpv = beanDefinition.getPropertyValues();
  139. mpv.addPropertyValue("defaultTargetDataSource", defaultDataSource);
  140. mpv.addPropertyValue("targetDataSources", targetDataSources);
  141. //注册 - BeanDefinitionRegistry
  142. beanDefinitionRegistry.registerBeanDefinition("dataSource", beanDefinition);
  143. System.out.println("Dynamic DataSource Registry");
  144. }
  145. public DataSource buildDataSource(Map<String, Object> dataSourceMap) {
  146. try {
  147. Object type = dataSourceMap.get("type");
  148. if (type == null) {
  149. type = DATASOURCE_TYPE_DEFAULT;// 默认DataSource
  150. }
  151. Class<? extends DataSource> dataSourceType;
  152. dataSourceType = (Class<? extends DataSource>) Class.forName((String) type);
  153. String driverClassName = String.valueOf(dataSourceMap.get("driver"));
  154. String url = String.valueOf(dataSourceMap.get("url"));
  155. String username = String.valueOf(dataSourceMap.get("username"));
  156. String password = String.valueOf(dataSourceMap.get("password"));
  157. dataSourceMap.put("testWhileIdle", "true");
  158. // 自定义DataSource配置
  159. // DataSourceBuilder factory = DataSourceBuilder.create().driverClassName(driverClassName).url(url)
  160. // .username(username).password(password).type(dataSourceType);
  161. DruidDataSource factory = (DruidDataSource) DruidDataSourceFactory.createDataSource(dataSourceMap);
  162. return factory;
  163. } catch (ClassNotFoundException e) {
  164. e.printStackTrace();
  165. } catch (Exception e) {
  166. e.printStackTrace();
  167. }
  168. return null;
  169. }
  170. }