MagicDynamicDataSource.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package org.ssssssss.magicapi.config;
  2. import org.apache.commons.lang3.StringUtils;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.jdbc.core.JdbcTemplate;
  6. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  7. import org.springframework.jdbc.datasource.DataSourceUtils;
  8. import org.ssssssss.magicapi.adapter.DialectAdapter;
  9. import org.ssssssss.magicapi.dialect.Dialect;
  10. import org.ssssssss.magicapi.exception.MagicAPIException;
  11. import org.ssssssss.magicapi.utils.Assert;
  12. import javax.sql.DataSource;
  13. import java.sql.Connection;
  14. import java.util.ArrayList;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. public class MagicDynamicDataSource {
  19. private static Logger logger = LoggerFactory.getLogger(MagicDynamicDataSource.class);
  20. private Map<String, MagicDynamicDataSource.DataSourceNode> dataSourceMap = new HashMap<>();
  21. /**
  22. * 注册默认数据源
  23. */
  24. public void put(DataSource dataSource) {
  25. put(null, dataSource);
  26. }
  27. /**
  28. * 注册数据源(可以运行时注册)
  29. *
  30. * @param dataSourceName 数据源名称
  31. */
  32. public void put(String dataSourceName, DataSource dataSource) {
  33. if (dataSourceName == null) {
  34. dataSourceName = "";
  35. }
  36. logger.info("注册数据源:{}", StringUtils.isNotBlank(dataSourceName) ? dataSourceName : "default");
  37. this.dataSourceMap.put(dataSourceName, new MagicDynamicDataSource.DataSourceNode(dataSource));
  38. }
  39. /**
  40. * 获取全部数据源
  41. */
  42. public List<String> datasources(){
  43. return new ArrayList<>(this.dataSourceMap.keySet());
  44. }
  45. /**
  46. * 删除数据源
  47. * @param datasourceName 数据源名称
  48. */
  49. public boolean delete(String datasourceName){
  50. boolean result = false;
  51. // 检查参数是否合法
  52. if(datasourceName != null && !datasourceName.isEmpty()){
  53. result = this.dataSourceMap.remove(datasourceName) != null;
  54. }
  55. logger.info("删除数据源:{}:{}", datasourceName, result ? "成功" : "失败");
  56. return result;
  57. }
  58. /**
  59. * 获取默认数据源
  60. * @return
  61. */
  62. public MagicDynamicDataSource.DataSourceNode getDataSource() {
  63. return getDataSource(null);
  64. }
  65. /**
  66. * 获取数据源
  67. * @param dataSourceName 数据源名称
  68. */
  69. public MagicDynamicDataSource.DataSourceNode getDataSource(String dataSourceName) {
  70. if (dataSourceName == null) {
  71. dataSourceName = "";
  72. }
  73. MagicDynamicDataSource.DataSourceNode dataSourceNode = dataSourceMap.get(dataSourceName);
  74. Assert.isNotNull(dataSourceNode, String.format("找不到数据源%s", dataSourceName));
  75. return dataSourceNode;
  76. }
  77. public static class DataSourceNode {
  78. /**
  79. * 事务管理器
  80. */
  81. private DataSourceTransactionManager dataSourceTransactionManager;
  82. private JdbcTemplate jdbcTemplate;
  83. private DataSource dataSource;
  84. private Dialect dialect;
  85. public DataSourceNode(DataSource dataSource) {
  86. this.dataSource = dataSource;
  87. this.dataSourceTransactionManager = new DataSourceTransactionManager(this.dataSource);
  88. this.jdbcTemplate = new JdbcTemplate(dataSource);
  89. }
  90. public JdbcTemplate getJdbcTemplate(){
  91. return this.jdbcTemplate;
  92. }
  93. public DataSourceTransactionManager getDataSourceTransactionManager() {
  94. return dataSourceTransactionManager;
  95. }
  96. public Dialect getDialect(DialectAdapter dialectAdapter){
  97. if(this.dialect == null){
  98. Connection connection = null;
  99. try {
  100. connection = this.dataSource.getConnection();
  101. this.dialect = dialectAdapter.getDialectFromUrl(connection.getMetaData().getURL());
  102. if(this.dialect == null){
  103. throw new MagicAPIException("自动获取数据库方言失败");
  104. }
  105. } catch (Exception e) {
  106. throw new MagicAPIException("自动获取数据库方言失败", e);
  107. } finally {
  108. DataSourceUtils.releaseConnection(connection, this.dataSource);
  109. }
  110. }
  111. return dialect;
  112. }
  113. }
  114. public void setDefault(DataSource dataSource) {
  115. put(dataSource);
  116. }
  117. public void add(String dataSourceName, DataSource dataSource) {
  118. put(dataSourceName, dataSource);
  119. }
  120. }