Browse Source

关闭数据源

mxd 4 năm trước cách đây
mục cha
commit
24b61849e1

+ 15 - 3
src/main/java/org/ssssssss/magicapi/config/MagicDynamicDataSource.java

@@ -10,6 +10,7 @@ import org.ssssssss.magicapi.adapter.DialectAdapter;
 import org.ssssssss.magicapi.dialect.Dialect;
 import org.ssssssss.magicapi.exception.MagicAPIException;
 import org.ssssssss.magicapi.utils.Assert;
+import org.ssssssss.magicapi.utils.IoUtils;
 
 import javax.sql.DataSource;
 import java.sql.Connection;
@@ -59,7 +60,10 @@ public class MagicDynamicDataSource {
 			dataSourceKey = "";
 		}
 		logger.info("注册数据源:{}", StringUtils.isNotBlank(dataSourceKey) ? dataSourceKey : "default");
-		this.dataSourceMap.put(dataSourceKey, new MagicDynamicDataSource.DataSourceNode(dataSource, dataSourceKey, datasourceName, id, maxRows));
+		DataSourceNode node = this.dataSourceMap.put(dataSourceKey, new DataSourceNode(dataSource, dataSourceKey, datasourceName, id, maxRows));
+		if(node != null){
+			node.close();
+		}
 		if (id != null) {
 			String finalDataSourceKey = dataSourceKey;
 			this.dataSourceMap.entrySet().stream()
@@ -67,7 +71,7 @@ public class MagicDynamicDataSource {
 					.findFirst()
 					.ifPresent(it -> {
 						logger.info("移除旧数据源:{}", it.getValue().getKey());
-						this.dataSourceMap.remove(it.getValue().getKey());
+						this.dataSourceMap.remove(it.getValue().getKey()).close();
 					});
 		}
 	}
@@ -95,7 +99,11 @@ public class MagicDynamicDataSource {
 		boolean result = false;
 		// 检查参数是否合法
 		if (datasourceKey != null && !datasourceKey.isEmpty()) {
-			result = this.dataSourceMap.remove(datasourceKey) != null;
+			DataSourceNode node = this.dataSourceMap.remove(datasourceKey);
+			result = node!= null;
+			if(result){
+				node.close();
+			}
 		}
 		logger.info("删除数据源:{}:{}", datasourceKey, result ? "成功" : "失败");
 		return result;
@@ -216,5 +224,9 @@ public class MagicDynamicDataSource {
 		public DataSource getDataSource() {
 			return dataSource;
 		}
+
+		public void close(){
+			IoUtils.closeDataSource(this.dataSource);
+		}
 	}
 }

+ 4 - 1
src/main/java/org/ssssssss/magicapi/controller/MagicDataSourceController.java

@@ -71,11 +71,14 @@ public class MagicDataSourceController extends MagicController implements MagicE
 	@RequestMapping("/datasource/test")
 	@ResponseBody
 	public JsonBean<String> test(@RequestBody Map<String, String> properties) {
+		DataSource dataSource = null;
 		try {
-			DataSource dataSource = createDataSource(properties);
+			dataSource = createDataSource(properties);
 			dataSource.getConnection();
 		} catch (Exception e) {
 			return new JsonBean<>(e.getMessage());
+		} finally {
+			IoUtils.closeDataSource(dataSource);
 		}
 		return new JsonBean<>();
 	}

+ 18 - 0
src/main/java/org/ssssssss/magicapi/utils/IoUtils.java

@@ -3,9 +3,12 @@ package org.ssssssss.magicapi.utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.sql.DataSource;
 import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Pattern;
@@ -138,4 +141,19 @@ public class IoUtils {
 		}
 		return file.delete();
 	}
+
+	public static void closeDataSource(DataSource dataSource) {
+		if (dataSource != null) {
+			if (dataSource instanceof Closeable) {
+				try {
+					((Closeable) dataSource).close();
+				} catch (Exception e) {
+					logger.warn("Close DataSource error", e);
+				}
+			} else {
+				logger.warn("DataSource can not close");
+			}
+		}
+
+	}
 }