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

This commit is contained in:
mxd
2021-06-18 08:56:51 +08:00
parent a3b16a37a6
commit 27062fd5b9
3 changed files with 27 additions and 24 deletions

View File

@@ -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;
}
}

View File

@@ -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("自动获取数据库方言失败");
}

View File

@@ -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