瀏覽代碼

新增手动刷新数据库

赵冬冬 3 年之前
父節點
當前提交
2ac9638236

+ 11 - 11
pom.xml

@@ -41,16 +41,16 @@
                 <docker.image.version>1.0.0</docker.image.version>
             </properties>
         </profile>
-<!--        <profile>-->
-<!--            <id>dev</id>-->
-<!--            <properties>-->
-<!--                <profiles.active>dev</profiles.active>-->
-<!--                &lt;!&ndash; Docker 配置 &ndash;&gt;-->
-<!--                <docker.dockerHost>https://49.235.127.212:2375</docker.dockerHost>-->
-<!--                &lt;!&ndash;                <docker.serviceId>DockerHub</docker.serviceId>&ndash;&gt;-->
-<!--                <docker.image.version>1.0.0</docker.image.version>-->
-<!--            </properties>-->
-<!--        </profile>-->
+        <!--        <profile>-->
+        <!--            <id>dev</id>-->
+        <!--            <properties>-->
+        <!--                <profiles.active>dev</profiles.active>-->
+        <!--                &lt;!&ndash; Docker 配置 &ndash;&gt;-->
+        <!--                <docker.dockerHost>https://49.235.127.212:2375</docker.dockerHost>-->
+        <!--                &lt;!&ndash;                <docker.serviceId>DockerHub</docker.serviceId>&ndash;&gt;-->
+        <!--                <docker.image.version>1.0.0</docker.image.version>-->
+        <!--            </properties>-->
+        <!--        </profile>-->
     </profiles>
 
     <dependencies>
@@ -186,7 +186,7 @@
                     <!--指定远程 docker api地址-->
                     <dockerHost>${docker.dockerHost}</dockerHost>
                     <!--证书路劲-->
-<!--                    <dockerCertPath>D:\software\docker</dockerCertPath>-->
+                    <!--                    <dockerCertPath>D:\software\docker</dockerCertPath>-->
                     <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                     <resources>
                         <resource>

+ 88 - 0
src/main/java/com/xin/shardingspherejdbcdemo/config/sharding/DBShardingAlgorithm.java

@@ -0,0 +1,88 @@
+//package com.xin.shardingspherejdbcdemo.config.sharding;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
+//import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
+//
+//import java.util.Collection;
+//
+///*
+// * @author :zjq
+// * @date :2020/11/9 10:44
+// * @description: TODO       数据表分表策略 TableShardingAlgorithm
+// * @version: V1.0
+// * @slogan: 天下风云出我辈,一入代码岁月催
+// */
+//@Slf4j
+//public class DBShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
+//    @Override
+//    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
+//
+//        System.out.println("DB  PreciseShardingAlgorithm  ");
+//        // 真实节点
+//        availableTargetNames.stream().forEach((item) -> {
+//            log.info("actual node db:{}", item);
+//        });
+//
+//        log.info("logic table name:{},rout column:{}", shardingValue.getLogicTableName(), shardingValue.getColumnName());
+//
+//        //精确分片
+//        log.info("column value:{}", shardingValue.getValue());
+//
+//        long orderId = shardingValue.getValue();
+//
+//        long db_index = orderId & (2 - 1);
+//
+//        for (String each : availableTargetNames) {
+//            if (each.equals("b"+db_index)) {
+//                return each;
+//            }
+//        }
+//
+//        throw new IllegalArgumentException();
+//    }
+//}
+//package com.xin.shardingspherejdbcdemo.config.sharding;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
+//import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
+//
+//import java.util.Collection;
+//
+///*
+// * @author :zjq
+// * @date :2020/11/9 10:44
+// * @description: TODO       数据表分表策略 TableShardingAlgorithm
+// * @version: V1.0
+// * @slogan: 天下风云出我辈,一入代码岁月催
+// */
+//@Slf4j
+//public class DBShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
+//    @Override
+//    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
+//
+//        System.out.println("DB  PreciseShardingAlgorithm  ");
+//        // 真实节点
+//        availableTargetNames.stream().forEach((item) -> {
+//            log.info("actual node db:{}", item);
+//        });
+//
+//        log.info("logic table name:{},rout column:{}", shardingValue.getLogicTableName(), shardingValue.getColumnName());
+//
+//        //精确分片
+//        log.info("column value:{}", shardingValue.getValue());
+//
+//        long orderId = shardingValue.getValue();
+//
+//        long db_index = orderId & (2 - 1);
+//
+//        for (String each : availableTargetNames) {
+//            if (each.equals("b"+db_index)) {
+//                return each;
+//            }
+//        }
+//
+//        throw new IllegalArgumentException();
+//    }
+//}

+ 18 - 0
src/main/java/com/xin/shardingspherejdbcdemo/config/sharding/DynamicTablesProperties.java

@@ -0,0 +1,18 @@
+//package com.xin.shardingspherejdbcdemo.config.sharding;
+//
+//import lombok.Data;
+//import org.springframework.boot.context.properties.ConfigurationProperties;
+//
+///**
+// * 动态分表配置
+// *
+// * @author qimok
+// * @since 2020-09-07
+// */
+//@ConfigurationProperties(prefix = "spring.shardingsphere.sharding.tables")
+//@Data
+//public class DynamicTablesProperties {
+//
+//    String[] names;
+//
+//}

+ 27 - 0
src/main/java/com/xin/shardingspherejdbcdemo/config/sharding/MyDataSourceConfig.java

@@ -0,0 +1,27 @@
+package com.xin.shardingspherejdbcdemo.config.sharding;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+@Configuration
+@ConfigurationProperties(prefix = "mydbinfo")
+public class MyDataSourceConfig {
+    public static List<MyDataSourcePropertie> list;   //static 才能拿配置值
+
+    public static Map<String, MyDataSourcePropertie> getDataSourceConfig() {
+        Map<String, MyDataSourcePropertie> data = new HashMap<>();
+        for (MyDataSourcePropertie myDataSourcePropertie : list) {
+            data.put(myDataSourcePropertie.getShardingDbName(), myDataSourcePropertie);
+        }
+        return data;
+    }
+
+    public void setList(List<MyDataSourcePropertie> list) {
+        MyDataSourceConfig.list = list;
+    }
+}

+ 14 - 0
src/main/java/com/xin/shardingspherejdbcdemo/config/sharding/MyDataSourcePropertie.java

@@ -0,0 +1,14 @@
+package com.xin.shardingspherejdbcdemo.config.sharding;
+
+import lombok.Data;
+
+@Data
+public class MyDataSourcePropertie {
+    private String shardingDbName;
+    private String ip;
+    private String port;
+    private String dbname;
+    private String username;
+    private String password;
+    private String tables;
+}

+ 73 - 0
src/main/java/com/xin/shardingspherejdbcdemo/config/sharding/ShardingTableRuleActualDataNodesRefreshJob.java

@@ -0,0 +1,73 @@
+//package com.xin.shardingspherejdbcdemo.config.sharding;
+//
+//import com.google.common.collect.Maps;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.compress.utils.Sets;
+//import org.apache.ibatis.javassist.Modifier;
+//import org.apache.shardingsphere.core.rule.DataNode;
+//import org.apache.shardingsphere.core.rule.TableRule;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.scheduling.annotation.Scheduled;
+//import org.springframework.stereotype.Component;
+//
+//import javax.annotation.PostConstruct;
+//import javax.annotation.Resource;
+//import javax.sql.DataSource;
+//import java.lang.reflect.Field;
+//import java.util.Collection;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.Set;
+//import java.util.concurrent.atomic.AtomicInteger;
+//
+///**
+// * 基于范围分表的 ActualDataNodes 动态刷新JOB
+// *
+// * @author qimok
+// * @since 2020-09-07
+// */
+//@Slf4j
+//@Component
+//public class ShardingTableRuleActualDataNodesRefreshJob {
+//    @Resource(name = "shardingDataSource")
+//    private DataSource dataSource;
+//
+//    @Autowired
+//    private DynamicTablesProperties dynamicTables;
+//
+//    /**
+//     * 6 个小时执行一次
+//     */
+//    @PostConstruct
+//    @Scheduled(fixedRate = 1000 * 60 * 60 * 12)
+//    public void refreshActualDataNodes() throws NoSuchFieldException, IllegalAccessException {
+//
+//    }
+//
+//    /**
+//     * 动态刷新数据源
+//     */
+//    private void dynamicRefreshDatasource(String dataSourceName, TableRule tableRule, List<DataNode> newDataNodes)
+//            throws NoSuchFieldException, IllegalAccessException {
+//        Set<String> actualTables = Sets.newHashSet();
+//        Map<DataNode, Integer> dataNodeIndexMap = Maps.newHashMap();
+//        AtomicInteger index = new AtomicInteger(0);
+//        newDataNodes.forEach(dataNode -> {
+//            actualTables.add(dataNode.getTableName());
+//            if (index.intValue() == 0) {
+//                dataNodeIndexMap.put(dataNode, 0);
+//            } else {
+//                dataNodeIndexMap.put(dataNode, index.intValue());
+//            }
+//            index.incrementAndGet();
+//        });
+//        // 动态刷新:actualDataNodesField
+//        Field actualDataNodesField = TableRule.class.getDeclaredField("actualDataNodes");
+//        Field modifiersField = Field.class.getDeclaredField("modifiers");
+//        modifiersField.setAccessible(true);
+//        modifiersField.setInt(actualDataNodesField, actualDataNodesField.getModifiers() & ~Modifier.FINAL);
+//        actualDataNodesField.setAccessible(true);
+//        actualDataNodesField.set(tableRule, newDataNodes);
+//
+//    }
+//}

+ 59 - 0
src/main/java/com/xin/shardingspherejdbcdemo/config/sharding/TableShardingAlgorithm.java

@@ -0,0 +1,59 @@
+package com.xin.shardingspherejdbcdemo.config.sharding;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
+import org.springframework.stereotype.Component;
+
+import java.util.Collection;
+import java.util.Date;
+
+/*
+ * @author :zjq
+ * @date :2020/11/9 10:44
+ * @description: TODO       数据表分表策略 TableShardingAlgorithm
+ * @version: V1.0
+ * @slogan: 天下风云出我辈,一入代码岁月催
+ */
+@Slf4j
+@Component
+public class TableShardingAlgorithm implements PreciseShardingAlgorithm<Date> {
+    @Override
+    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) {
+
+        System.out.println("table PreciseShardingAlgorithm ");
+        // 真实节点
+        availableTargetNames.stream().forEach((item) -> {
+            log.info("actual node table:{}", item);
+        });
+
+        log.info("logic table name:{},rout column:{}", shardingValue.getLogicTableName(), shardingValue.getColumnName());
+
+        //精确分片
+        log.info("column value:{}", shardingValue.getValue());
+
+
+        String tb_name = shardingValue.getLogicTableName();
+
+
+        // 根据当前日期 来 分库分表
+        Date date = shardingValue.getValue();
+        String year = String.format("%tY", date);
+        String mon =String.valueOf(Integer.parseInt(String.format("%tm", date))); // 去掉前缀0
+        String dat = String.format("%td", date);
+
+
+        // 选择表
+        tb_name = tb_name + year;
+        log.info("tb_name:" + tb_name);
+
+        for (String each : availableTargetNames) {
+            log.info("tb_name:" + each);
+            if (each.equals(tb_name)) {
+                return each;
+            }
+        }
+
+        throw new IllegalArgumentException();
+    }
+}

+ 154 - 0
src/main/java/com/xin/shardingspherejdbcdemo/controller/JdbcController.java

@@ -0,0 +1,154 @@
+package com.xin.shardingspherejdbcdemo.controller;
+
+import com.google.common.collect.Maps;
+import com.xin.shardingspherejdbcdemo.config.sharding.MyDataSourceConfig;
+import com.xin.shardingspherejdbcdemo.config.sharding.MyDataSourcePropertie;
+import com.xin.shardingspherejdbcdemo.entity.Order;
+import com.xin.shardingspherejdbcdemo.entity.vo.AjaxVo;
+import com.xin.shardingspherejdbcdemo.service.impl.JdbcServiceImpl;
+import com.xin.shardingspherejdbcdemo.utils.JdbcUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.Lists;
+import org.apache.commons.compress.utils.Sets;
+import org.apache.ibatis.javassist.Modifier;
+import org.apache.shardingsphere.core.config.ShardingConfigurationException;
+import org.apache.shardingsphere.core.rule.DataNode;
+import org.apache.shardingsphere.core.rule.ShardingRule;
+import org.apache.shardingsphere.core.rule.TableRule;
+import org.apache.shardingsphere.shardingjdbc.jdbc.core.datasource.ShardingDataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.sql.DataSource;
+import java.lang.reflect.Field;
+import java.sql.*;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@Controller
+@RequestMapping("/jdbc")
+@Slf4j
+public class JdbcController {
+
+    static {
+        try {
+            Class.forName("com.mysql.cj.jdbc.Driver");//加载数据库驱动
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Autowired
+    private JdbcServiceImpl jdbcService;
+
+    @GetMapping("/test")
+    @ResponseBody
+    public AjaxVo createTable() throws SQLException {
+        jdbcService.createTable();
+        return AjaxVo.success();
+    }
+
+
+    @Resource(name = "shardingDataSource")
+    private DataSource dataSource;
+
+    @Autowired
+    private MyDataSourceConfig myDataSourceConfig;
+
+    @GetMapping
+    @ResponseBody
+    public AjaxVo saveUser() throws SQLException, NoSuchFieldException, IllegalAccessException {
+
+        Map<String, MyDataSourcePropertie> dataSourceConfig = myDataSourceConfig.getDataSourceConfig();
+
+
+        try {
+            ShardingDataSource shardingDataSource = (ShardingDataSource) dataSource;
+            ShardingRule shardingRule = shardingDataSource.getRuntimeContext().getRule();
+            //tableRule = shardingRule.getTableRule(dynamicTableName);
+            List<TableRule> tableRules = (List<TableRule>) shardingRule.getTableRules();
+
+            for (TableRule tableRule : tableRules) {
+                String logicTableName = tableRule.getLogicTable();
+                Collection<String> actualDatasourceNames = tableRule.getActualDatasourceNames();
+                for (String dataSourceName : actualDatasourceNames) {
+                    MyDataSourcePropertie myDataSourcePropertie = dataSourceConfig.get(dataSourceName);
+                    if (!StringUtils.isEmpty(myDataSourcePropertie)) {
+                        //并且包含需要自动刷新的表
+                        if (myDataSourcePropertie.getTables().contains(logicTableName)) {
+                            //获取最近节点
+                            List<DataNode> newDataNodes = getDataNodes(myDataSourcePropertie, dataSourceName, logicTableName);
+                            //刷新数据库jdbc连接信息
+                            dynamicRefreshDatasource(dataSourceName, tableRule, newDataNodes);
+                        }
+                    }
+                }
+
+            }
+
+
+        } catch (ShardingConfigurationException e) {
+            log.error(String.format("逻辑表:%s 动态分表配置错误!"));
+        }
+
+
+        return AjaxVo.success();
+    }
+
+    /**
+     * 获取数据节点
+     */
+    private List<DataNode> getDataNodes(MyDataSourcePropertie myDaSoPro, String dataSourceName, String logicTableName) throws SQLException {
+        List<DataNode> newDataNodes = new ArrayList<>();
+        List<String> tables = JdbcUtils.queryTable(myDaSoPro.getIp(), myDaSoPro.getPort(), myDaSoPro.getDbname(), myDaSoPro.getUsername(), myDaSoPro.getPassword(), logicTableName);
+        for (String table : tables) {
+            DataNode dataNode = new DataNode(dataSourceName+"."+table);
+            newDataNodes.add(dataNode);
+        }
+        // 扩展点
+        return newDataNodes;
+    }
+
+    /**
+     * 动态刷新数据源
+     */
+    private void dynamicRefreshDatasource(String dataSourceName, TableRule tableRule, List<DataNode> newDataNodes)
+            throws NoSuchFieldException, IllegalAccessException {
+        Set<String> actualTables = Sets.newHashSet();
+        Map<DataNode, Integer> dataNodeIndexMap = Maps.newHashMap();
+        AtomicInteger index = new AtomicInteger(0);
+        newDataNodes.forEach(dataNode -> {
+            actualTables.add(dataNode.getTableName());
+            if (index.intValue() == 0) {
+                dataNodeIndexMap.put(dataNode, 0);
+            } else {
+                dataNodeIndexMap.put(dataNode, index.intValue());
+            }
+            index.incrementAndGet();
+        });
+        // 动态刷新:actualDataNodesField
+        Field actualDataNodesField = TableRule.class.getDeclaredField("actualDataNodes");
+        Field modifiersField = Field.class.getDeclaredField("modifiers");
+        modifiersField.setAccessible(true);
+        modifiersField.setInt(actualDataNodesField, actualDataNodesField.getModifiers() & ~Modifier.FINAL);
+        actualDataNodesField.setAccessible(true);
+        actualDataNodesField.set(tableRule, newDataNodes);
+        // 动态刷新:actualTablesField
+        Field actualTablesField = TableRule.class.getDeclaredField("actualTables");
+        actualTablesField.setAccessible(true);
+        actualTablesField.set(tableRule, actualTables);
+        // 动态刷新:dataNodeIndexMapField
+        Field dataNodeIndexMapField = TableRule.class.getDeclaredField("dataNodeIndexMap");
+        dataNodeIndexMapField.setAccessible(true);
+        dataNodeIndexMapField.set(tableRule, dataNodeIndexMap);
+        // 动态刷新:datasourceToTablesMapField
+        Map<String, Collection<String>> datasourceToTablesMap = Maps.newHashMap();
+        datasourceToTablesMap.put(dataSourceName, actualTables);
+        Field datasourceToTablesMapField = TableRule.class.getDeclaredField("datasourceToTablesMap");
+        datasourceToTablesMapField.setAccessible(true);
+        datasourceToTablesMapField.set(tableRule, datasourceToTablesMap);
+    }
+}

+ 1 - 1
src/main/java/com/xin/shardingspherejdbcdemo/entity/Order.java

@@ -8,7 +8,7 @@ import java.math.BigDecimal;
 import java.util.Date;
 
 @Data
-@TableName("t_order")
+@TableName("t_order_")
 public class Order {
 
     private Long id;

+ 2 - 2
src/main/java/com/xin/shardingspherejdbcdemo/entity/User.java

@@ -7,7 +7,7 @@ import lombok.Data;
 import java.util.Date;
 
 @Data
-@TableName("user")
+@TableName("t_user")
 public class User {
     /** */
     private Long id;
@@ -23,4 +23,4 @@ public class User {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
-}
+}

+ 21 - 0
src/main/java/com/xin/shardingspherejdbcdemo/service/impl/JdbcServiceImpl.java

@@ -0,0 +1,21 @@
+package com.xin.shardingspherejdbcdemo.service.impl;
+
+import com.xin.shardingspherejdbcdemo.utils.JdbcUtils;
+import org.springframework.stereotype.Service;
+
+import java.sql.SQLException;
+
+@Service
+public class JdbcServiceImpl {
+
+    public boolean createTable() throws SQLException {
+        String ip = "192.168.29.131";
+        String port = "3306";
+        String dbName = "sharding_user";
+        String username = "root";
+        String password = "123456";
+        String tableName = "t_order_2022";
+        return JdbcUtils.createTable(ip, port, dbName, username, password, tableName);
+    }
+
+}

+ 116 - 0
src/main/java/com/xin/shardingspherejdbcdemo/utils/JdbcUtils.java

@@ -0,0 +1,116 @@
+package com.xin.shardingspherejdbcdemo.utils;
+
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class JdbcUtils {
+    static {
+        try {
+            Class.forName("com.mysql.cj.jdbc.Driver");//加载数据库驱动
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static List<String> queryTable(String ip, String port, String dbName, String username, String password, String tableName) throws SQLException {
+        List<String> tables = new ArrayList<>();
+        String url = "jdbc:mysql://" + ip + ":" + port + "/" + dbName;
+        Connection conn = null;
+        //2.获取与数据库的链接
+        conn = DriverManager.getConnection(url, username, password);
+        String sql = "select table_name from information_schema.tables where table_schema=? AND table_name LIKE ?";
+        //3.获取用于向数据库发送sql语句的Preperedstatement
+        PreparedStatement st = conn.prepareStatement(sql);//在此次传入,进行预编译
+        st.setString(1, dbName);
+        st.setString(2, tableName+"%");
+        ResultSet rs = st.executeQuery();
+        //循环取出
+        if (rs.next()) {
+            String id = rs.getString("table_name");//1代表数据库中表的列数,id在第一列也可以("id")!!!
+            System.out.println(id + " ");
+            tables.add(id);
+        }
+        //6.关闭链接,释放资源
+        if (rs != null) {
+            try {
+                rs.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            rs = null;
+        }
+        if (st != null) {
+            try {
+                st.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        if (conn != null) {
+            try {
+                conn.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return tables;
+
+    }
+
+    public static boolean createTable(String ip, String port, String dbName, String username, String password, String tableName) throws SQLException {
+        boolean flage = false;
+        String url = "jdbc:mysql://" + ip + ":" + port + "/" + dbName;
+        Connection conn = null;
+        //2.获取与数据库的链接
+        conn = DriverManager.getConnection(url, username, password);
+        String splitStr = "_";
+        //3.获取用于向数据库发送sql语句的statement
+        String[] s = tableName.split(splitStr);
+        Integer year = Integer.valueOf(s[2]);
+        year = year - 1;
+        String oldTableName = s[0] + splitStr + s[1] + splitStr + year;
+        //4.向数据库发sql
+        String sql = "select table_name from information_schema.tables where table_schema=? AND table_name=? ";
+        //3.获取用于向数据库发送sql语句的Preperedstatement
+        PreparedStatement st = conn.prepareStatement(sql);//在此次传入,进行预编译
+        st.setString(1, dbName);
+        st.setString(2, tableName);
+        ResultSet rs = st.executeQuery();
+        //循环取出(id)
+        flage = rs.next();
+        if (!flage) {
+            Statement statement = conn.createStatement();
+            sql = "CREATE TABLE IF NOT EXISTS" + tableName + " LIKE " + oldTableName;
+            //3.获取用于向数据库发送sql语句的Preperedstatement
+            flage = statement.execute(sql);
+        }
+
+        //6.关闭链接,释放资源
+        if (rs != null) {
+            try {
+                rs.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            rs = null;
+        }
+        if (st != null) {
+            try {
+                st.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        if (conn != null) {
+            try {
+                conn.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return flage;
+
+    }
+}

+ 23 - 5
src/main/resources/application-test.yml

@@ -14,9 +14,24 @@ mybatis:
 dbinfo:
   username: root
   password: 123456
+
+mydbinfo:
+  list:
+  - shardingDbName: sharding-user
+    ip: 192.168.29.131
+    port: 3306
+    dbname: sharding_user
+    username: root
+    password: 123456
+    tables: t_order_
+
 spring:
   main:
     allow-bean-definition-overriding: true
+  #打印sql
+  props:
+    sql:
+      show: true
   shardingsphere:
     datasource:
       #数据库别名
@@ -30,13 +45,16 @@ spring:
     sharding:
       tables:
         #逻辑表名
-        user:
+        t_user:
           actual-data-nodes: sharding-user.t_user$->{0..2}
           table-strategy:
             inline:
               sharding-column: id
               algorithm-expression: t_user$->{id%3}
-    #打印sql
-    props:
-      sql:
-        show: true
+        t_order_:
+          actual-data-nodes: sharding-user.t_order_$->{2021}
+          table-strategy:
+            standard:
+              sharding-column: create_time
+              precise-algorithm-class-name: com.xin.shardingspherejdbcdemo.config.sharding.TableShardingAlgorithm
+