Browse Source

调整匹配数据库方言的方式。

mxd 4 years ago
parent
commit
27062fd5b9

+ 13 - 22
magic-api/src/main/java/org/ssssssss/magicapi/adapter/DialectAdapter.java

@@ -4,10 +4,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.ssssssss.magicapi.dialect.*;
 
+import java.sql.Connection;
+import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 public class DialectAdapter {
 
@@ -15,11 +15,6 @@ public class DialectAdapter {
 
 	private final List<Dialect> dialectList = new ArrayList<>();
 
-	/**
-	 * 缓存已解析的方言
-	 */
-	private final Map<String, Dialect> dialectMap = new ConcurrentHashMap<>();
-
 	public DialectAdapter() {
 		add(new MySQLDialect());
 		add(new OracleDialect());
@@ -35,23 +30,19 @@ public class DialectAdapter {
 		this.dialectList.add(dialect);
 	}
 
-	/**
-	 * 获取数据库方言
-	 */
-	public Dialect getDialectFromUrl(String fromUrl) {
-		Dialect cached = dialectMap.get(fromUrl);
-		if (cached == null && !dialectMap.containsKey(fromUrl)) {
-			for (Dialect dialect : dialectList) {
-				if (dialect.match(fromUrl)) {
-					cached = dialect;
-					break;
+	public Dialect getDialectFromConnection(Connection connection) {
+		for (Dialect dialect : dialectList) {
+			try {
+				if (dialect.match(connection)) {
+					return dialect;
 				}
+			} catch (SQLException e) {
+				logger.debug("方言{}匹配失败", dialect, e);
 			}
-			if (cached == null) {
-				logger.warn(String.format("magic-api在%s中无法获取dialect", fromUrl));
-			}
-			dialectMap.put(fromUrl, cached);
 		}
-		return cached;
+		logger.warn("magic-api在{}中无法获取dialect", connection);
+		return null;
 	}
+
+
 }

+ 1 - 1
magic-api/src/main/java/org/ssssssss/magicapi/config/MagicDynamicDataSource.java

@@ -213,7 +213,7 @@ public class MagicDynamicDataSource {
 				Connection connection = null;
 				try {
 					connection = this.dataSource.getConnection();
-					this.dialect = dialectAdapter.getDialectFromUrl(connection.getMetaData().getURL());
+					this.dialect = dialectAdapter.getDialectFromConnection(connection);
 					if (this.dialect == null) {
 						throw new MagicAPIException("自动获取数据库方言失败");
 					}

+ 13 - 1
magic-api/src/main/java/org/ssssssss/magicapi/dialect/Dialect.java

@@ -3,12 +3,24 @@ package org.ssssssss.magicapi.dialect;
 
 import org.ssssssss.magicapi.modules.BoundSql;
 
+import java.sql.Connection;
+import java.sql.SQLException;
+
 public interface Dialect {
 
 	/**
 	 * 根据jdbcUrl匹配
 	 */
-	boolean match(String jdbcUrl);
+	default boolean match(String jdbcUrl){
+		return false;
+	}
+
+	/**
+	 * 根据Connection匹配
+	 */
+	default boolean match(Connection connection) throws SQLException {
+		return match(connection.getMetaData().getURL());
+	}
 
 	/**
 	 * 获取查总数的sql