From eca308e06fe2c172871f57d17837cb85035d8329 Mon Sep 17 00:00:00 2001
From: wangw <1594593906@qq.com>
Date: Mon, 30 Dec 2024 14:02:26 +0800
Subject: [PATCH] ShardingConfig
---
pom.xml | 55 ++++-
src/main/java/com/sqx/SqxApplication.java | 43 ++--
src/main/java/com/sqx/config/RedisConfig.java | 7 +
.../java/com/sqx/config/ShardingConfig.java | 153 ++++++++++++++
...ataSourcePoolMetricsAutoConfiguration.java | 67 ++++++
.../java/com/sqx/config/SwaggerConfig.java | 143 +++++++------
.../sqx/datasource/annotation/DataSource.java | 14 --
.../datasource/aspect/DataSourceAspect.java | 61 ------
.../config/DynamicContextHolder.java | 47 -----
.../datasource/config/DynamicDataSource.java | 15 --
.../config/DynamicDataSourceConfig.java | 53 -----
.../config/DynamicDataSourceFactory.java | 44 ----
.../properties/DataSourceProperties.java | 192 ------------------
.../DynamicDataSourceProperties.java | 22 --
.../app/controller/app/AppController.java | 2 +-
.../controller/app/AppCommonController.java | 2 +-
.../com/sqx/sharding/MasterSlaveRules.java | 22 ++
.../com/sqx/sharding/ShardingDataBase.java | 61 ++++++
src/main/resources/application-local.yml | 61 ++++++
src/main/resources/application.properties | 1 +
src/main/resources/application.yml | 10 +-
21 files changed, 542 insertions(+), 533 deletions(-)
create mode 100644 src/main/java/com/sqx/config/ShardingConfig.java
create mode 100644 src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java
delete mode 100644 src/main/java/com/sqx/datasource/annotation/DataSource.java
delete mode 100644 src/main/java/com/sqx/datasource/aspect/DataSourceAspect.java
delete mode 100644 src/main/java/com/sqx/datasource/config/DynamicContextHolder.java
delete mode 100644 src/main/java/com/sqx/datasource/config/DynamicDataSource.java
delete mode 100644 src/main/java/com/sqx/datasource/config/DynamicDataSourceConfig.java
delete mode 100644 src/main/java/com/sqx/datasource/config/DynamicDataSourceFactory.java
delete mode 100644 src/main/java/com/sqx/datasource/properties/DataSourceProperties.java
delete mode 100644 src/main/java/com/sqx/datasource/properties/DynamicDataSourceProperties.java
create mode 100644 src/main/java/com/sqx/sharding/MasterSlaveRules.java
create mode 100644 src/main/java/com/sqx/sharding/ShardingDataBase.java
create mode 100644 src/main/resources/application-local.yml
create mode 100644 src/main/resources/application.properties
diff --git a/pom.xml b/pom.xml
index b22e84e9..31ec0b85 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,12 +35,14 @@
7.2.23
3.4.0
4.4
- 2.7.0
+
+ 2.9.2
2.9.9
2.8.5
1.2.83
4.6.10
1.18.4
+ 4.1.1
+
+ com.baomidou
+ dynamic-datasource-spring-boot-starter
+ 4.1.3
+
+
mysql
mysql-connector-java
@@ -257,6 +278,23 @@
com.oracle
ojdbc6
${oracle.version}
+
+
+
+ org.apache.shardingsphere
+ sharding-core-api
+ ${shardingsphere.version}
+ compile
+
+
+ org.apache.shardingsphere
+ sharding-jdbc-core
+ ${shardingsphere.version}
+ compile
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
@@ -327,14 +365,25 @@
io.springfox
- springfox-swagger2
+ springfox-swagger-ui
${swagger.version}
io.springfox
- springfox-swagger-ui
+ springfox-swagger2
${swagger.version}
+
+ io.swagger
+ swagger-annotations
+ 1.5.22
+
+
+ io.swagger
+ swagger-models
+ 1.5.22
+
+
com.qiniu
qiniu-java-sdk
diff --git a/src/main/java/com/sqx/SqxApplication.java b/src/main/java/com/sqx/SqxApplication.java
index a3c22cfd..fada8ced 100644
--- a/src/main/java/com/sqx/SqxApplication.java
+++ b/src/main/java/com/sqx/SqxApplication.java
@@ -1,6 +1,7 @@
package com.sqx;
import com.sqx.modules.pay.wuyou.WuyouPay;
+import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@@ -18,25 +19,29 @@ import java.util.Map;
public class SqxApplication {
public static void main(String[] args) {
- ConfigurableApplicationContext context = SpringApplication.run(SqxApplication.class, args);
- context.getEnvironment().getPropertySources().forEach(source -> {
- if (source.getName().contains("application-dev.yml") || source.getName().contains("application-prod.yml")) {
- if (source.getSource() instanceof Map) {
- ((Map) source.getSource()).forEach((key, value) -> {
- System.out.println(key + ": " + value);
- if ("pay.orderNotifyUrl".equals(key)) {
- WuyouPay.setNotifyUrl(value.toString());
- }
- if ("pay.extractNotifyUrl".equals(key)) {
- WuyouPay.setExtractNotifyUrl(value.toString());
- }
- if ("pay.h5BaseUrl".equals(key)) {
- WuyouPay.setH5BaseUrl(value.toString());
- }
- });
- }
- }
- });
+ SpringApplication application = new SpringApplication(SqxApplication.class);
+ application.setBannerMode(Banner.Mode.OFF);
+ application.run(args);
+
+// ConfigurableApplicationContext context = SpringApplication.run(SqxApplication.class, args);
+// context.getEnvironment().getPropertySources().forEach(source -> {
+// if (source.getName().contains("application-dev.yml") || source.getName().contains("application-prod.yml")) {
+// if (source.getSource() instanceof Map) {
+// ((Map) source.getSource()).forEach((key, value) -> {
+// System.out.println(key + ": " + value);
+// if ("pay.orderNotifyUrl".equals(key)) {
+// WuyouPay.setNotifyUrl(value.toString());
+// }
+// if ("pay.extractNotifyUrl".equals(key)) {
+// WuyouPay.setExtractNotifyUrl(value.toString());
+// }
+// if ("pay.h5BaseUrl".equals(key)) {
+// WuyouPay.setH5BaseUrl(value.toString());
+// }
+// });
+// }
+// }
+// });
System.out.println("(♥◠‿◠)ノ゙ 短剧系统启动成功 ლ(´ڡ`ლ)゙ \n"+
" _ \n" +
" | | \n" +
diff --git a/src/main/java/com/sqx/config/RedisConfig.java b/src/main/java/com/sqx/config/RedisConfig.java
index 6fddb78c..3188988c 100644
--- a/src/main/java/com/sqx/config/RedisConfig.java
+++ b/src/main/java/com/sqx/config/RedisConfig.java
@@ -1,5 +1,6 @@
package com.sqx.config;
+import com.sqx.common.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
@@ -70,4 +71,10 @@ public class RedisConfig {
public ZSetOperations zSetOperations(RedisTemplate redisTemplate) {
return redisTemplate.opsForZSet();
}
+
+ @Bean
+ public RedisUtils redisUtils() {
+ // 根据实际情况初始化RedisUtils实例,可能需要传入相关配置参数,如Redis连接信息等
+ return new RedisUtils();
+ }
}
diff --git a/src/main/java/com/sqx/config/ShardingConfig.java b/src/main/java/com/sqx/config/ShardingConfig.java
new file mode 100644
index 00000000..12e0e2ed
--- /dev/null
+++ b/src/main/java/com/sqx/config/ShardingConfig.java
@@ -0,0 +1,153 @@
+package com.sqx.config;
+
+import com.sqx.sharding.MasterSlaveRules;
+import com.sqx.sharding.ShardingDataBase;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.api.config.masterslave.MasterSlaveRuleConfiguration;
+import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
+import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
+import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * sharding-jdbc 配置文件
+ */
+@Slf4j
+@Data
+@Configuration
+@ConfigurationProperties(prefix = "spring.shardingsphere")
+public class ShardingConfig {
+
+ /**
+ * 读取数据源信息
+ */
+ private Map datasource;
+ /**
+ * 读写分离的配置
+ */
+ private Map masterSlaveRules;
+ /**
+ * 显示sharding-jdbc的sql
+ */
+ private String showSql;
+
+ /**
+ * 中心库的节点
+ */
+ private String centerTablesDataNode;
+
+ @Value("${center-tables}")
+ private String tableNamesAsString;
+
+ /**
+ * 中心表,不进行分库操作
+ */
+// @Value("${center-tables}")
+ private Set centerTables;
+
+ @PostConstruct
+ public void init() {
+ // 使用换行符进行分割,然后去除空白字符,收集到Set集合中
+ centerTables = Arrays.stream(tableNamesAsString.split(","))
+ .map(String::trim)
+ .collect(Collectors.toSet());
+ }
+
+
+ /**
+ * 配置sharding-jdbc数据源
+ */
+ @Bean
+ public DataSource dataSource() throws SQLException {
+ ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
+
+ // 配置数据库主从
+ shardingRuleConfig.setMasterSlaveRuleConfigs(masterSlaveRuleConfigs());
+
+ // 配置表的切分策略
+ shardingRuleConfig.setTableRuleConfigs(addTableRuleConfigs());
+
+ // 配置是否显示sql
+// Properties props = new Properties();
+// props.put("sql.show", true);
+
+ // 配置数据源
+ Map dataSourceMap = getShardingDataBase();
+ return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, null);
+// return ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props);
+ }
+
+ /**
+ * 配置
+ */
+ private Set addTableRuleConfigs() {
+ Set sets = new HashSet<>();
+ for (String centerTable : centerTables) {
+ TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(centerTable,
+ String.format(centerTablesDataNode, centerTable));
+ sets.add(tableRuleConfig);
+ }
+
+// // 定义区域表的分库规则
+// InlineShardingStrategyConfiguration databaseShardingStrategyConfig = new InlineShardingStrategyConfiguration(
+// regionTablesShardingDatabaseColumn, regionTablesShardingDatabaseAlgorithm);
+// for (String regionTable : regionTables) {
+// TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(regionTable, String.format(regionTablesDataNode, regionTable));
+// tableRuleConfig.setDatabaseShardingStrategyConfig(databaseShardingStrategyConfig);
+// sets.add(tableRuleConfig);
+// }
+ return sets;
+ }
+
+ /**
+ * 配置数据源
+ */
+ private Map getShardingDataBase() {
+ String testQuery = "SELECT 1";
+ Map map = new HashMap<>();
+ datasource.forEach((datasourceName, shardingDataBase) -> {
+ HikariConfig config = new HikariConfig();
+ config.setDriverClassName(shardingDataBase.getDriverClassName());
+ config.setJdbcUrl(shardingDataBase.getJdbcUrl());
+ config.setUsername(shardingDataBase.getUsername());
+ config.setPassword(shardingDataBase.getPassword());
+ config.setPoolName(datasourceName);
+ config.setMinimumIdle(shardingDataBase.getMinimumIdle());
+ config.setMaximumPoolSize(shardingDataBase.getMaximumPoolSize());
+ config.setIdleTimeout(shardingDataBase.getIdleTimeout());
+ config.setMaxLifetime(shardingDataBase.getMaxLifetime());
+ config.setConnectionTimeout(shardingDataBase.getConnectionTimeout());
+ config.setConnectionTestQuery(testQuery);
+ map.put(datasourceName, new HikariDataSource(config));
+ });
+ return map;
+ }
+
+ /**
+ * 配置读写分离
+ */
+ private Set masterSlaveRuleConfigs() {
+ Set sets = new HashSet<>();
+ masterSlaveRules.forEach((databaseName, masterSlaveRules) -> {
+ MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration(databaseName,
+ masterSlaveRules.getMasterDataSourceName(), masterSlaveRules.getSlaveDataSourceNames());
+ System.out.println("写入"+masterSlaveRules.getMasterDataSourceName());
+ System.out.println("读出"+masterSlaveRules.getSlaveDataSourceNames());
+ sets.add(masterSlaveRuleConfig);
+ });
+ return sets;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java b/src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java
new file mode 100644
index 00000000..c3454b5a
--- /dev/null
+++ b/src/main/java/com/sqx/config/ShardingDataSourcePoolMetricsAutoConfiguration.java
@@ -0,0 +1,67 @@
+package com.sqx.config;
+
+import com.zaxxer.hikari.HikariDataSource;
+import com.zaxxer.hikari.metrics.micrometer.MicrometerMetricsTrackerFactory;
+import io.micrometer.core.instrument.MeterRegistry;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.shardingjdbc.jdbc.core.datasource.ShardingDataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
+import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.jdbc.DataSourceUnwrapper;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+import java.util.Collection;
+
+/**
+ * @author wxkj0012
+ */
+@Configuration(proxyBeanMethods = false)
+@AutoConfigureAfter({MetricsAutoConfiguration.class, DataSourceAutoConfiguration.class,
+ SimpleMetricsExportAutoConfiguration.class})
+@ConditionalOnClass({DataSource.class, MeterRegistry.class})
+@ConditionalOnBean({DataSource.class, MeterRegistry.class})
+@Slf4j
+public class ShardingDataSourcePoolMetricsAutoConfiguration {
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass({ShardingDataSource.class, HikariDataSource.class})
+ static class ShardingDataSourceMetricsConfiguration {
+
+ private final MeterRegistry registry;
+
+ ShardingDataSourceMetricsConfiguration(MeterRegistry registry) {
+ this.registry = registry;
+ }
+
+ @Autowired
+ void bindMetricsRegistryToHikariDataSources(Collection dataSources) {
+ for (DataSource dataSource : dataSources) {
+ ShardingDataSource shardingDataSource = DataSourceUnwrapper.unwrap(dataSource, ShardingDataSource.class);
+ Collection shardDataSources = shardingDataSource.getDataSourceMap().values();
+ for (DataSource ds : shardDataSources) {
+ HikariDataSource hikariDataSource = DataSourceUnwrapper.unwrap(ds, HikariDataSource.class);
+ if (hikariDataSource != null) {
+ bindMetricsRegistryToHikariDataSource(hikariDataSource);
+ }
+ }
+ }
+ }
+
+ private void bindMetricsRegistryToHikariDataSource(HikariDataSource hikari) {
+ if (hikari.getMetricRegistry() == null && hikari.getMetricsTrackerFactory() == null) {
+ try {
+ hikari.setMetricsTrackerFactory(new MicrometerMetricsTrackerFactory(this.registry));
+ } catch (Exception ex) {
+ log.warn("Failed to bind Hikari metrics: {}}", ex.getMessage());
+ }
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/config/SwaggerConfig.java b/src/main/java/com/sqx/config/SwaggerConfig.java
index 8cf4bfee..8f991bfa 100644
--- a/src/main/java/com/sqx/config/SwaggerConfig.java
+++ b/src/main/java/com/sqx/config/SwaggerConfig.java
@@ -1,58 +1,85 @@
-package com.sqx.config;
-
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-import springfox.documentation.builders.ApiInfoBuilder;
-import springfox.documentation.builders.PathSelectors;
-import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.ApiKey;
-import springfox.documentation.spi.DocumentationType;
-import springfox.documentation.spring.web.plugins.Docket;
-import springfox.documentation.swagger2.annotations.EnableSwagger2;
-
-import java.util.List;
-
-import static com.google.common.collect.Lists.newArrayList;
-
-@Configuration
-@EnableSwagger2
-public class SwaggerConfig implements WebMvcConfigurer {
-
- @Value("${swagger.enabled}")
- private boolean enabled;
-
- @Bean
- public Docket createRestApi() {
- return new Docket(DocumentationType.SWAGGER_2)
- .enable(enabled)
- .apiInfo(apiInfo())
- .select()
- //加了ApiOperation注解的类,才生成接口文档
- .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
- //包下的类,才生成接口文档
- //.apis(RequestHandlerSelectors.basePackage("com.sqx.controller"))
- .paths(PathSelectors.any())
- .build()
- .securitySchemes(security());
- }
-
- private ApiInfo apiInfo() {
- return new ApiInfoBuilder()
- .title("")
- .description("sqx-fast文档")
- .termsOfServiceUrl("")
- .version("3.0.0")
- .build();
- }
-
- private List security() {
- return newArrayList(
- new ApiKey("token", "token", "header")
- );
- }
-
-}
\ No newline at end of file
+//package com.sqx.config;
+//
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Profile;
+//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+//import springfox.documentation.builders.ApiInfoBuilder;
+//import springfox.documentation.builders.PathSelectors;
+//import springfox.documentation.builders.RequestHandlerSelectors;
+//import springfox.documentation.service.ApiInfo;
+//import springfox.documentation.service.ApiKey;
+//import springfox.documentation.spi.DocumentationType;
+//import springfox.documentation.spring.web.plugins.Docket;
+//import springfox.documentation.swagger2.annotations.EnableSwagger2;
+//
+//import java.util.List;
+//
+//import static com.google.common.collect.Lists.newArrayList;
+//
+////@Configuration
+////@EnableSwagger2
+////public class SwaggerConfig implements WebMvcConfigurer {
+////
+//// @Value("${swagger.enabled}")
+//// private boolean enabled;
+////
+//// @Bean
+//// public Docket createRestApi() {
+//// return new Docket(DocumentationType.SWAGGER_2)
+//// .enable(enabled)
+//// .apiInfo(apiInfo())
+//// .select()
+//// //加了ApiOperation注解的类,才生成接口文档
+//// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+//// //包下的类,才生成接口文档
+//// //.apis(RequestHandlerSelectors.basePackage("com.sqx.controller"))
+//// .paths(PathSelectors.any())
+//// .build()
+//// .securitySchemes(security());
+//// }
+////
+//// private ApiInfo apiInfo() {
+//// return new ApiInfoBuilder()
+//// .title("")
+//// .description("sqx-fast文档")
+//// .termsOfServiceUrl("")
+//// .version("3.0.0")
+//// .build();
+//// }
+////
+//// private List security() {
+//// return newArrayList(
+//// new ApiKey("token", "token", "header")
+//// );
+//// }
+////
+////}
+//
+//@Configuration
+//@EnableSwagger2
+//@Profile({"local", "dev"})
+//public class SwaggerConfig {
+//
+// @Bean
+// public Docket api() {
+// return new Docket(DocumentationType.SWAGGER_2)
+// .apiInfo(apiInfo())
+// .select()
+// .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+// .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+// .paths(PathSelectors.any())
+// .build();
+// }
+//
+// private ApiInfo apiInfo() {
+// return new ApiInfoBuilder()
+// .title("悠车位后台API接口文档")
+// .description("悠车位服务端后台API接口文档")
+// .version("1.0")
+// .build();
+// }
+//}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/datasource/annotation/DataSource.java b/src/main/java/com/sqx/datasource/annotation/DataSource.java
deleted file mode 100644
index 082da71b..00000000
--- a/src/main/java/com/sqx/datasource/annotation/DataSource.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.sqx.datasource.annotation;
-
-import java.lang.annotation.*;
-
-/**
- * 多数据源注解
- */
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-@Inherited
-public @interface DataSource {
- String value() default "";
-}
diff --git a/src/main/java/com/sqx/datasource/aspect/DataSourceAspect.java b/src/main/java/com/sqx/datasource/aspect/DataSourceAspect.java
deleted file mode 100644
index b3c5d0ac..00000000
--- a/src/main/java/com/sqx/datasource/aspect/DataSourceAspect.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.sqx.datasource.aspect;
-
-
-import com.sqx.datasource.annotation.DataSource;
-import com.sqx.datasource.config.DynamicContextHolder;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-import org.aspectj.lang.reflect.MethodSignature;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.lang.reflect.Method;
-
-/**
- * 多数据源,切面处理类
- */
-@Aspect
-@Component
-@Order(Ordered.HIGHEST_PRECEDENCE)
-public class DataSourceAspect {
- protected Logger logger = LoggerFactory.getLogger(getClass());
-
- @Pointcut("@annotation(com.sqx.datasource.annotation.DataSource) " +
- "|| @within(com.sqx.datasource.annotation.DataSource)")
- public void dataSourcePointCut() {
-
- }
-
- @Around("dataSourcePointCut()")
- public Object around(ProceedingJoinPoint point) throws Throwable {
- MethodSignature signature = (MethodSignature) point.getSignature();
- Class targetClass = point.getTarget().getClass();
- Method method = signature.getMethod();
-
- DataSource targetDataSource = (DataSource)targetClass.getAnnotation(DataSource.class);
- DataSource methodDataSource = method.getAnnotation(DataSource.class);
- if(targetDataSource != null || methodDataSource != null){
- String value;
- if(methodDataSource != null){
- value = methodDataSource.value();
- }else {
- value = targetDataSource.value();
- }
-
- DynamicContextHolder.push(value);
- logger.debug("set datasource is {}", value);
- }
-
- try {
- return point.proceed();
- } finally {
- DynamicContextHolder.poll();
- logger.debug("clean datasource");
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/datasource/config/DynamicContextHolder.java b/src/main/java/com/sqx/datasource/config/DynamicContextHolder.java
deleted file mode 100644
index f059bf76..00000000
--- a/src/main/java/com/sqx/datasource/config/DynamicContextHolder.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.sqx.datasource.config;
-
-import java.util.ArrayDeque;
-import java.util.Deque;
-
-/**
- * 多数据源上下文
- */
-public class DynamicContextHolder {
- @SuppressWarnings("unchecked")
- private static final ThreadLocal> CONTEXT_HOLDER = new ThreadLocal() {
- @Override
- protected Object initialValue() {
- return new ArrayDeque();
- }
- };
-
- /**
- * 获得当前线程数据源
- *
- * @return 数据源名称
- */
- public static String peek() {
- return CONTEXT_HOLDER.get().peek();
- }
-
- /**
- * 设置当前线程数据源
- *
- * @param dataSource 数据源名称
- */
- public static void push(String dataSource) {
- CONTEXT_HOLDER.get().push(dataSource);
- }
-
- /**
- * 清空当前线程数据源
- */
- public static void poll() {
- Deque deque = CONTEXT_HOLDER.get();
- deque.poll();
- if (deque.isEmpty()) {
- CONTEXT_HOLDER.remove();
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/sqx/datasource/config/DynamicDataSource.java b/src/main/java/com/sqx/datasource/config/DynamicDataSource.java
deleted file mode 100644
index 4374032b..00000000
--- a/src/main/java/com/sqx/datasource/config/DynamicDataSource.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.sqx.datasource.config;
-
-import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
-
-/**
- * 多数据源
- */
-public class DynamicDataSource extends AbstractRoutingDataSource {
-
- @Override
- protected Object determineCurrentLookupKey() {
- return DynamicContextHolder.peek();
- }
-
-}
diff --git a/src/main/java/com/sqx/datasource/config/DynamicDataSourceConfig.java b/src/main/java/com/sqx/datasource/config/DynamicDataSourceConfig.java
deleted file mode 100644
index 9c1033fd..00000000
--- a/src/main/java/com/sqx/datasource/config/DynamicDataSourceConfig.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.sqx.datasource.config;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import com.sqx.datasource.properties.DataSourceProperties;
-import com.sqx.datasource.properties.DynamicDataSourceProperties;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 配置多数据源
- */
-@Configuration
-@EnableConfigurationProperties(DynamicDataSourceProperties.class)
-public class DynamicDataSourceConfig {
- @Autowired
- private DynamicDataSourceProperties properties;
-
- @Bean
- @ConfigurationProperties(prefix = "spring.datasource.druid")
- public DataSourceProperties dataSourceProperties() {
- return new DataSourceProperties();
- }
-
- @Bean
- public DynamicDataSource dynamicDataSource(DataSourceProperties dataSourceProperties) {
- DynamicDataSource dynamicDataSource = new DynamicDataSource();
- dynamicDataSource.setTargetDataSources(getDynamicDataSource());
-
- //默认数据源
- DruidDataSource defaultDataSource = DynamicDataSourceFactory.buildDruidDataSource(dataSourceProperties);
- dynamicDataSource.setDefaultTargetDataSource(defaultDataSource);
-
- return dynamicDataSource;
- }
-
- private Map