1
0

DynamicDataSource.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package com.izouma.awesomeadmin.datasource;
  2. import com.izouma.awesomeadmin.dao.DataSourceInfoMapper;
  3. import com.izouma.awesomeadmin.model.DataSourceInfo;
  4. import com.izouma.awesomeadmin.util.Const;
  5. import org.apache.commons.dbcp.BasicDataSource;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  8. import javax.sql.DataSource;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. public class DynamicDataSource extends AbstractRoutingDataSource {
  12. private static final Map targetDataSource = new HashMap<>();
  13. protected DataSource masterDataSource;
  14. @Override
  15. protected DataSource determineTargetDataSource() {
  16. // 根据数据库选择方案,拿到要访问的数据库
  17. String dataSourceName = determineCurrentLookupKey();
  18. if (!dataSourceName.equals("dataSource")) {
  19. DataSource datasource = (DataSource) targetDataSource.get(DynamicDataSourceHolder.getDataSource());
  20. if (datasource == null) {
  21. datasource = createDataSource(DynamicDataSourceHolder.getDataSource());
  22. targetDataSource.put(DynamicDataSourceHolder.getDataSource(), datasource);
  23. }
  24. return datasource;
  25. } else {
  26. return masterDataSource;
  27. }
  28. }
  29. @Override
  30. protected String determineCurrentLookupKey() {
  31. return DynamicDataSourceHolder.getDataSource();
  32. }
  33. public DataSource getMasterDataSource() {
  34. return masterDataSource;
  35. }
  36. public void setMasterDataSource(DataSource masterDataSource) {
  37. this.masterDataSource = masterDataSource;
  38. }
  39. //创建数据源
  40. private BasicDataSource createDataSource(String datasource) {
  41. // 查询所需信息
  42. DataSourceInfo dataSourceInfo = Const.DataSourceInfoMap.get(datasource);
  43. if (dataSourceInfo != null) {
  44. if ("Mysql".equals(dataSourceInfo.getDatabaseType())) {
  45. return createDataSource("com.mysql.jdbc.Driver", "jdbc:mysql://" + dataSourceInfo.getUrl() + "/" + dataSourceInfo.getDatabaseName(), dataSourceInfo.getUsername(), dataSourceInfo.getPassword());
  46. } else if ("SqlServer".equals(dataSourceInfo.getDatabaseType())) {
  47. return createDataSource("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://" + dataSourceInfo.getUrl() + ";DatabaseName=" + dataSourceInfo.getDatabaseName(), dataSourceInfo.getUsername(), dataSourceInfo.getPassword());
  48. }
  49. }
  50. return null;
  51. }
  52. //创建数据源
  53. private BasicDataSource createDataSource(String driverClassName, String url,
  54. String username, String password) {
  55. BasicDataSource dataSource = new BasicDataSource();
  56. dataSource.setDriverClassName(driverClassName);
  57. dataSource.setUrl(url);
  58. dataSource.setUsername(username);
  59. dataSource.setPassword(password);
  60. dataSource.setTestWhileIdle(true);
  61. return dataSource;
  62. }
  63. }