Browse Source

多数据源

xiaoqiao 1 year ago
parent
commit
30a53dd5ee

+ 2 - 0
.idea/smartsearch2.iml

@@ -147,5 +147,7 @@
         <SOURCES />
       </library>
     </orderEntry>
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.7" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjrt:1.9.7" level="project" />
   </component>
 </module>

+ 10 - 0
pom.xml

@@ -147,6 +147,16 @@
             <scope>system</scope>
             <systemPath>${project.basedir}\lib\aspose-words-15.8.0-jdk16.jar</systemPath>
         </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+            <version>${aspectj.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjrt</artifactId>
+            <version>${aspectj.version}</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 3 - 0
src/main/java/com/bowintek/practice/services/impl/PositionServiceImpl.java

@@ -6,6 +6,8 @@ import com.bowintek.practice.mapper.cquery.PositionCQuery;
 import com.bowintek.practice.model.*;
 import com.bowintek.practice.services.service.PositionService;
 import com.bowintek.practice.util.StringUtils;
+import com.bowintek.practice.util.multipdb.DBTypeEnum;
+import com.bowintek.practice.util.multipdb.SwitchDataSource;
 import com.bowintek.practice.vo.PositionModel;
 import com.bowintek.practice.vo.practicebase.ImportPositionModel;
 import com.github.pagehelper.PageHelper;
@@ -30,6 +32,7 @@ public class PositionServiceImpl implements PositionService {
     private StringUtils stringUtils;
 
     @Override
+    @SwitchDataSource(DBTypeEnum.POSTGRE)
     public PageInfo<PositionModel> getList(Integer page, Integer rows,
                                            String schoolYearID, String majorGradeID,
                                            String practiceBaseTypeID,

+ 0 - 1
src/main/java/com/bowintek/practice/services/impl/system/MenuServiceImpl.java

@@ -28,7 +28,6 @@ public class MenuServiceImpl implements MenuService {
         List<HashMap<String, Object>> menus = menuCQuery.selectParentMenuList(null, menuNo, menuName);
         return getChildMenuList(menus, parentMenuNo);
     }
-
     public List<HashMap<String, Object>> getChildMenuList(List<HashMap<String, Object>> menus, String parentMenuNo) {
         List<HashMap<String, Object>> parentMenus = menus.stream().filter(x -> stringUtils.IsNullOrEmpty(parentMenuNo) ? x.get("parentMenuNo") == null : parentMenuNo.equals((String) x.get("parentMenuNo"))).collect(Collectors.toList());
         parentMenus.stream().forEach(menu -> {

+ 2 - 0
src/main/java/com/bowintek/practice/services/impl/system/RoleServiceImpl.java

@@ -7,6 +7,8 @@ import com.bowintek.practice.mapper.cquery.RoleCQuery;
 import com.bowintek.practice.model.*;
 import com.bowintek.practice.services.service.system.RoleService;
 import com.bowintek.practice.util.StringUtils;
+import com.bowintek.practice.util.multipdb.DBTypeEnum;
+import com.bowintek.practice.util.multipdb.SwitchDataSource;
 import com.bowintek.practice.vo.system.FunctionCodeModel;
 import com.bowintek.practice.vo.system.RoleFunctionCodeModel;
 import com.bowintek.practice.vo.system.RoleModel;

+ 3 - 3
src/main/java/com/bowintek/practice/util/DruidDBConfig.java

@@ -13,7 +13,7 @@ import org.springframework.context.annotation.Configuration;
 import javax.sql.DataSource;
 import java.sql.SQLException;
 
-@Configuration
+//@Configuration
 public class DruidDBConfig {
     private static final Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);
 
@@ -45,7 +45,7 @@ public class DruidDBConfig {
 
     // 解决 spring.datasource.filters=stat,wall,log4j 无法正常注册进去
     //@ConfigurationProperties(prefix = DB_PREFIX)
-    class IDataSourceProperties {
+   /* class IDataSourceProperties {
         private String url;
         private String username;
         private String password;
@@ -239,5 +239,5 @@ public class DruidDBConfig {
         public void setConnectionProperties(String connectionProperties) {
             this.connectionProperties = connectionProperties;
         }
-    }
+    }*/
 }

+ 24 - 0
src/main/java/com/bowintek/practice/util/multipdb/DBTypeEnum.java

@@ -0,0 +1,24 @@
+package com.bowintek.practice.util.multipdb;
+
+public enum DBTypeEnum {
+    /**
+     * smartsearch
+     */
+    SMARTSEARCH("smartsearch"),
+
+    /**
+     * 宽表数据库
+     */
+    POSTGRE("postgre");
+
+    private final String value;
+
+    DBTypeEnum(String value) {
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+}
+

+ 40 - 0
src/main/java/com/bowintek/practice/util/multipdb/DataSourceConfig.java

@@ -0,0 +1,40 @@
+package com.bowintek.practice.util.multipdb;
+
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.Map;
+
+@Configuration
+public class DataSourceConfig {
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.smartsearch")
+    public DataSource masterDataSource(){
+        return new DruidDataSourceBuilder().build();
+    }
+
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource.postgre")
+    public DataSource slaveDataSource(){
+        return new DruidDataSourceBuilder().build();
+    }
+
+    @Bean
+    @Primary
+    public DataSource multipleDataSource(DataSource masterDataSource,DataSource slaveDataSource){
+        DynamicDataSource multipleDataSource = new DynamicDataSource();
+        Map<Object, Object> dataSources = new HashMap<>();
+        dataSources.put(DBTypeEnum.SMARTSEARCH.getValue(), masterDataSource);
+        dataSources.put(DBTypeEnum.POSTGRE.getValue(), slaveDataSource);
+        multipleDataSource.setTargetDataSources(dataSources);
+        multipleDataSource.setDefaultTargetDataSource(masterDataSource);
+
+        return multipleDataSource;
+    }
+}

+ 38 - 0
src/main/java/com/bowintek/practice/util/multipdb/DataSourceSwitchAspect.java

@@ -0,0 +1,38 @@
+package com.bowintek.practice.util.multipdb;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * AOP方式动态切换数据源 (为了保证AOP在事务注解之前生效,Order的值越小,优先级越高)
+ */
+@Component
+@Aspect
+@Order(-100)
+public class DataSourceSwitchAspect {
+
+    @Pointcut("@annotation(SwitchDataSource)")
+    public void pointcut() {
+    }
+
+    @Before(value = "pointcut()")
+    public void before(JoinPoint joinPoint){
+        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+        SwitchDataSource dataSourceSwitch = methodSignature.getMethod().getAnnotation(SwitchDataSource.class);
+        System.out.println("使用数据源:"+dataSourceSwitch.value());
+
+        DbContextHolder.setDbType(dataSourceSwitch.value());
+    }
+
+    @After(value = "pointcut()")
+    public void after(JoinPoint joinPoint){
+        DbContextHolder.clearDbType();
+    }
+}
+

+ 29 - 0
src/main/java/com/bowintek/practice/util/multipdb/DbContextHolder.java

@@ -0,0 +1,29 @@
+package com.bowintek.practice.util.multipdb;
+
+public class DbContextHolder {
+    //使用ThreadLocal,防止线程安全问题
+    private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal();
+
+    /**
+     * 设置数据源
+     *
+     * @param dbTypeEnum 数据库类型
+     */
+    public static void setDbType(DBTypeEnum dbTypeEnum) {
+        CONTEXT_HOLDER.set(dbTypeEnum.getValue());
+    }
+
+    /**
+     * 取得当前数据源
+     */
+    public static String getDbType() {
+        return (String) CONTEXT_HOLDER.get();
+    }
+
+    /**
+     * 清除上下文数据
+     */
+    public static void clearDbType() {
+        CONTEXT_HOLDER.remove();
+    }
+}

+ 10 - 0
src/main/java/com/bowintek/practice/util/multipdb/DynamicDataSource.java

@@ -0,0 +1,10 @@
+package com.bowintek.practice.util.multipdb;
+
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+public class DynamicDataSource extends AbstractRoutingDataSource {
+    @Override
+    protected Object determineCurrentLookupKey() {
+        return DbContextHolder.getDbType();
+    }
+}

+ 14 - 0
src/main/java/com/bowintek/practice/util/multipdb/SwitchDataSource.java

@@ -0,0 +1,14 @@
+package com.bowintek.practice.util.multipdb;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({
+        ElementType.METHOD
+})
+public @interface SwitchDataSource {
+    DBTypeEnum value() default DBTypeEnum.SMARTSEARCH;
+}

+ 26 - 6
src/main/resources/application.yml

@@ -10,15 +10,35 @@ spring:
   datasource:
     name: practice_db
     type: com.alibaba.druid.pool.DruidDataSource
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    #基本属性
+    url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+    #url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+    username: root
+    password: bowin123
+    smartsearch:
+      # 数据源基本配置
+      username: root
+      password: bowin123
+      url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+      # driver-class需要注意mysql驱动的版本(com.mysql.cj.jdbc.Driver 或 com.mysql.jdbc.Driver)
+      driver-class-name: com.mysql.jdbc.Driver
+    postgre:
+      # 数据源基本配置
+      username: root
+      password: bowin123
+      url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+      # driver-class需要注意mysql驱动的版本(com.mysql.cj.jdbc.Driver 或 com.mysql.jdbc.Driver)
+      driver-class-name: com.mysql.jdbc.Driver
     druid:
       #监控统计拦截的filters
       filters: stat
-      driver-class-name: com.mysql.cj.jdbc.Driver
-      #基本属性
-      url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
-      #url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
-      username: root
-      password: bowin123
+#      driver-class-name: com.mysql.cj.jdbc.Driver
+#      #基本属性
+#      url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+#      #url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+#      username: root
+#      password: bowin123
       #配置初始化大小/最小/最大
       initial-size: 1
       min-idle: 1

+ 27 - 7
target/classes/application.yml

@@ -1,5 +1,5 @@
 server:
-  port: 8088
+  port: 8077
   tomcat:
     max-connections: 100000
     max-http-form-post-size: 102400000
@@ -10,15 +10,35 @@ spring:
   datasource:
     name: practice_db
     type: com.alibaba.druid.pool.DruidDataSource
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    #基本属性
+    url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+    #url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+    username: root
+    password: bowin123
+    smartsearch:
+      # 数据源基本配置
+      username: root
+      password: bowin123
+      url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+      # driver-class需要注意mysql驱动的版本(com.mysql.cj.jdbc.Driver 或 com.mysql.jdbc.Driver)
+      driver-class-name: com.mysql.jdbc.Driver
+    postgre:
+      # 数据源基本配置
+      username: root
+      password: bowin123
+      url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
+      # driver-class需要注意mysql驱动的版本(com.mysql.cj.jdbc.Driver 或 com.mysql.jdbc.Driver)
+      driver-class-name: com.mysql.jdbc.Driver
     druid:
       #监控统计拦截的filters
       filters: stat
-      driver-class-name: com.mysql.cj.jdbc.Driver
-      #基本属性
-      url: jdbc:mysql://192.168.0.68:3306/smartSearchDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
-      #url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
-      username: root
-      password: bowin123
+#      driver-class-name: com.mysql.cj.jdbc.Driver
+#      #基本属性
+#      url: jdbc:mysql://office.bowintek.com:3306/smartSearchDB?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+#      #url: jdbc:mysql://office.bowintek.com:3306/practicedb?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true
+#      username: root
+#      password: bowin123
       #配置初始化大小/最小/最大
       initial-size: 1
       min-idle: 1

BIN
target/classes/com/bowintek/practice/util/DruidDBConfig$IDataSourceProperties.class


BIN
target/classes/com/bowintek/practice/util/DruidDBConfig.class