DialectFactory增加identifyDriver重载

This commit is contained in:
Looly 2022-11-02 23:54:27 +08:00
parent fd2756d09b
commit 300fe3b6fd
2 changed files with 19 additions and 7 deletions

View File

@ -3,11 +3,12 @@
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.10.M1 (2022-10-27) # 5.8.10.M1 (2022-11-02)
### 🐣新特性 ### 🐣新特性
* 【http 】 HttpResponse增加getFileNameFromDisposition方法pr#2676@Github * 【http 】 HttpResponse增加getFileNameFromDisposition方法pr#2676@Github
* 【core 】 FileUtil.copy当来源为文件时返回文件而非目录 * 【core 】 FileUtil.copy当来源为文件时返回文件而非目录
* 【db 】 DialectFactory增加identifyDriver重载issue#I5YWI6@Gitee
### 🐞Bug修复 ### 🐞Bug修复
* 【db 】 修复分页时order by截断问题issue#I5X6FM@Gitee * 【db 】 修复分页时order by截断问题issue#I5X6FM@Gitee

View File

@ -22,9 +22,8 @@ import java.util.Map;
* 方言工厂类 * 方言工厂类
* *
* @author loolly * @author loolly
*
*/ */
public class DialectFactory implements DriverNamePool{ public class DialectFactory implements DriverNamePool {
private static final Map<DataSource, Dialect> DIALECT_POOL = new SafeConcurrentHashMap<>(); private static final Map<DataSource, Dialect> DIALECT_POOL = new SafeConcurrentHashMap<>();
@ -80,6 +79,17 @@ public class DialectFactory implements DriverNamePool{
* @return 驱动 * @return 驱动
*/ */
public static String identifyDriver(String nameContainsProductInfo) { public static String identifyDriver(String nameContainsProductInfo) {
return identifyDriver(nameContainsProductInfo, null);
}
/**
* 通过JDBC URL等信息识别JDBC驱动名
*
* @param nameContainsProductInfo 包含数据库标识的字符串
* @param classLoader 类加载器{@code null}表示默认上下文的类加载器
* @return 驱动
*/
public static String identifyDriver(String nameContainsProductInfo, ClassLoader classLoader) {
if (StrUtil.isBlank(nameContainsProductInfo)) { if (StrUtil.isBlank(nameContainsProductInfo)) {
return null; return null;
} }
@ -88,15 +98,15 @@ public class DialectFactory implements DriverNamePool{
// 首先判断是否为标准的JDBC URL截取jdbc:xxxx:中间部分 // 首先判断是否为标准的JDBC URL截取jdbc:xxxx:中间部分
final String name = ReUtil.getGroup1("jdbc:(.*?):", nameContainsProductInfo); final String name = ReUtil.getGroup1("jdbc:(.*?):", nameContainsProductInfo);
if(StrUtil.isNotBlank(name)){ if (StrUtil.isNotBlank(name)) {
nameContainsProductInfo = name; nameContainsProductInfo = name;
} }
String driver = null; String driver = null;
if (nameContainsProductInfo.contains("mysql") || nameContainsProductInfo.contains("cobar")) { if (nameContainsProductInfo.contains("mysql") || nameContainsProductInfo.contains("cobar")) {
driver = ClassLoaderUtil.isPresent(DRIVER_MYSQL_V6) ? DRIVER_MYSQL_V6 : DRIVER_MYSQL; driver = ClassLoaderUtil.isPresent(DRIVER_MYSQL_V6, classLoader) ? DRIVER_MYSQL_V6 : DRIVER_MYSQL;
} else if (nameContainsProductInfo.contains("oracle")) { } else if (nameContainsProductInfo.contains("oracle")) {
driver = ClassLoaderUtil.isPresent(DRIVER_ORACLE) ? DRIVER_ORACLE : DRIVER_ORACLE_OLD; driver = ClassLoaderUtil.isPresent(DRIVER_ORACLE, classLoader) ? DRIVER_ORACLE : DRIVER_ORACLE_OLD;
} else if (nameContainsProductInfo.contains("postgresql")) { } else if (nameContainsProductInfo.contains("postgresql")) {
driver = DRIVER_POSTGRESQL; driver = DRIVER_POSTGRESQL;
} else if (nameContainsProductInfo.contains("sqlite")) { } else if (nameContainsProductInfo.contains("sqlite")) {
@ -161,12 +171,13 @@ public class DialectFactory implements DriverNamePool{
/** /**
* 获取共享方言 * 获取共享方言
*
* @param ds 数据源每一个数据源对应一个唯一方言 * @param ds 数据源每一个数据源对应一个唯一方言
* @return {@link Dialect}方言 * @return {@link Dialect}方言
*/ */
public static Dialect getDialect(DataSource ds) { public static Dialect getDialect(DataSource ds) {
Dialect dialect = DIALECT_POOL.get(ds); Dialect dialect = DIALECT_POOL.get(ds);
if(null == dialect) { if (null == dialect) {
// 数据源作为锁的意义在于不同数据源不会导致阻塞相同数据源获取方言时可保证互斥 // 数据源作为锁的意义在于不同数据源不会导致阻塞相同数据源获取方言时可保证互斥
//noinspection SynchronizationOnLocalVariableOrMethodParameter //noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (ds) { synchronized (ds) {