From 02b8d6d3ca710869a10ea7a77d7d6f52887e40ea Mon Sep 17 00:00:00 2001 From: linbangquan <1437892690@qq.com> Date: Wed, 15 Nov 2023 18:25:23 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20SQL=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E9=80=82=E9=85=8DTiDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1024432422748160]SQL语句适配TiDB http://192.168.0.96:8090/demo/rdm.html#/task-detail/939050947543040/939050947543050/1024432422748160 --- src/main/java/META-INF/root-context.xml | 10 +---- .../plugin/NeatLogicDatabaseIdProvider.java | 45 +++++++------------ .../store/mysql/DatasourceManager.java | 13 ++++++ .../store/mysql/NeatLogicBasicDataSource.java | 12 ++--- 4 files changed, 38 insertions(+), 42 deletions(-) diff --git a/src/main/java/META-INF/root-context.xml b/src/main/java/META-INF/root-context.xml index 60f38ce9a..c8d5ba55d 100644 --- a/src/main/java/META-INF/root-context.xml +++ b/src/main/java/META-INF/root-context.xml @@ -100,15 +100,7 @@ - - - - mysql - oceanbase - tidb - - - + diff --git a/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java b/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java index e01091b78..22eb0929a 100644 --- a/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java +++ b/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java @@ -1,31 +1,22 @@ package neatlogic.framework.dao.plugin; +import neatlogic.framework.store.mysql.DatabaseVendor; +import neatlogic.framework.store.mysql.DatasourceManager; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; import org.apache.ibatis.mapping.DatabaseIdProvider; import javax.sql.DataSource; import java.sql.*; -import java.util.Map; import java.util.Objects; -import java.util.Properties; public class NeatLogicDatabaseIdProvider implements DatabaseIdProvider { - private final String MYSQL = "MySQL"; - private final String TIDB = "TiDB"; - private final String OCEAN_BASE = "OceanBase"; - private String databaseId; - private Properties properties; public NeatLogicDatabaseIdProvider() { } - @Override - public void setProperties(Properties p) { - this.properties = p; - } @Override public String getDatabaseId(DataSource dataSource) throws SQLException { @@ -37,6 +28,7 @@ public class NeatLogicDatabaseIdProvider implements DatabaseIdProvider { } try { databaseId = getDatabaseName(dataSource); + DatasourceManager.setDatabaseId(databaseId); } catch (Exception e) { LogHolder.log.error("Could not get a databaseId from dataSource", e); } @@ -44,24 +36,19 @@ public class NeatLogicDatabaseIdProvider implements DatabaseIdProvider { } private String getDatabaseName(DataSource dataSource) throws SQLException { - String productName = getDatabaseProductName(dataSource); - if (this.properties != null) { - for (Map.Entry property : properties.entrySet()) { - if (productName.contains((String) property.getKey())) { - return (String) property.getValue(); - } - } - // no match, return null - return null; + DatabaseVendor vendor = getDatabaseVendor(dataSource); + if (vendor != null) { + return vendor.getAlias(); } - return productName; + return null; } - private String getDatabaseProductName(DataSource dataSource) throws SQLException { + private DatabaseVendor getDatabaseVendor(DataSource dataSource) throws SQLException { try (Connection con = dataSource.getConnection()) { + DatabaseVendor vendor = null; DatabaseMetaData metaData = con.getMetaData(); String databaseProductName = metaData.getDatabaseProductName(); - if (Objects.equals(databaseProductName, MYSQL)) { + if (Objects.equals(databaseProductName, DatabaseVendor.MYSQL.getName())) { Statement statement = null; ResultSet resultSet = null; try { @@ -69,10 +56,12 @@ public class NeatLogicDatabaseIdProvider implements DatabaseIdProvider { resultSet = statement.executeQuery("SELECT @@version"); while (resultSet.next()) { String databaseProductVersion = resultSet.getString(1); - if (databaseProductVersion.contains(TIDB)) {// 8.0.11-TiDB-v7.4.0 - databaseProductName = TIDB; - } else if (databaseProductVersion.contains(OCEAN_BASE)) {// 5.7.25-OceanBase_CE-v4.2.0.0 - databaseProductName = OCEAN_BASE; + if (databaseProductVersion.contains(DatabaseVendor.TIDB.getName())) {// 8.0.11-TiDB-v7.4.0 + vendor = DatabaseVendor.TIDB; + } else if (databaseProductVersion.contains(DatabaseVendor.OCEAN_BASE.getName())) {// 5.7.25-OceanBase_CE-v4.2.0.0 + vendor = DatabaseVendor.OCEAN_BASE; + } else { + vendor = DatabaseVendor.MYSQL; } break; } @@ -87,7 +76,7 @@ public class NeatLogicDatabaseIdProvider implements DatabaseIdProvider { } } } - return databaseProductName; + return vendor; } } diff --git a/src/main/java/neatlogic/framework/store/mysql/DatasourceManager.java b/src/main/java/neatlogic/framework/store/mysql/DatasourceManager.java index d0b438eb7..0d26b7b48 100644 --- a/src/main/java/neatlogic/framework/store/mysql/DatasourceManager.java +++ b/src/main/java/neatlogic/framework/store/mysql/DatasourceManager.java @@ -36,6 +36,19 @@ public class DatasourceManager { private static NeatLogicRoutingDataSource datasource; + // 数据库厂商,mysql、oceanbase、tidb + private static String databaseId; + + public static void setDatabaseId(String _databaseId) { + if (databaseId == null) { + databaseId = _databaseId; + } + } + + public static String getDatabaseId() { + return databaseId; + } + @Resource public void setDataSource(NeatLogicRoutingDataSource _datasource) { datasource = _datasource; diff --git a/src/main/java/neatlogic/framework/store/mysql/NeatLogicBasicDataSource.java b/src/main/java/neatlogic/framework/store/mysql/NeatLogicBasicDataSource.java index 72f0d0ce5..5d10f0b58 100644 --- a/src/main/java/neatlogic/framework/store/mysql/NeatLogicBasicDataSource.java +++ b/src/main/java/neatlogic/framework/store/mysql/NeatLogicBasicDataSource.java @@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; +import java.util.Objects; public class NeatLogicBasicDataSource extends HikariDataSource {//替换dbcp2的BasicDataSource private final Logger logger = LoggerFactory.getLogger(NeatLogicBasicDataSource.class); @@ -35,11 +36,12 @@ public class NeatLogicBasicDataSource extends HikariDataSource {//替换dbcp2的 Connection conn = super.getConnection(); conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); try (Statement statement = conn.createStatement()) { - // TODO oceanbase数据库不支持optimizer_search_depth和join_buffer_size变量,暂时屏蔽 -// //设置mysql join顺序优化器最大深度是5,避免大SQL分析时间过慢 -// statement.execute("SET SESSION optimizer_search_depth = 5"); -// //设置join_buffer为16M,提升BNL性能 -// statement.execute("SET SESSION join_buffer_size = 16777216"); + if (Objects.equals(DatasourceManager.getDatabaseId(), DatabaseVendor.MYSQL.getAlias())) { + //设置mysql join顺序优化器最大深度是5,避免大SQL分析时间过慢 + statement.execute("SET SESSION optimizer_search_depth = 5"); + //设置join_buffer为16M,提升BNL性能 + statement.execute("SET SESSION join_buffer_size = 16777216"); + } if (UserContext.get() != null) { String timezone = UserContext.get().getTimezone(); if (StringUtils.isNotBlank(timezone)) { -- Gitee From 228bf9b39ac1ef99b3181fa3feaf2821cfd60fd6 Mon Sep 17 00:00:00 2001 From: linbangquan <1437892690@qq.com> Date: Wed, 15 Nov 2023 18:33:58 +0800 Subject: [PATCH 2/3] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20SQL=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E9=80=82=E9=85=8DTiDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1024432422748160]SQL语句适配TiDB http://192.168.0.96:8090/demo/rdm.html#/task-detail/939050947543040/939050947543050/1024432422748160 --- .../framework/store/mysql/DatabaseVendor.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/neatlogic/framework/store/mysql/DatabaseVendor.java diff --git a/src/main/java/neatlogic/framework/store/mysql/DatabaseVendor.java b/src/main/java/neatlogic/framework/store/mysql/DatabaseVendor.java new file mode 100644 index 000000000..cd38b938c --- /dev/null +++ b/src/main/java/neatlogic/framework/store/mysql/DatabaseVendor.java @@ -0,0 +1,24 @@ +package neatlogic.framework.store.mysql; + +public enum DatabaseVendor { + MYSQL("MySQL", "mysql"), + TIDB("TiDB", "tidb"), + OCEAN_BASE("OceanBase", "oceanbase") + ; + + String name; + String alias; + + DatabaseVendor(String name, String alias) { + this.name = name; + this.alias = alias; + } + + public String getName() { + return name; + } + + public String getAlias() { + return alias; + } +} -- Gitee From 5a86cfca0d4e118d623858651beb55e23dfd986a Mon Sep 17 00:00:00 2001 From: linbangquan <1437892690@qq.com> Date: Wed, 15 Nov 2023 18:35:33 +0800 Subject: [PATCH 3/3] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20SQL=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E9=80=82=E9=85=8DTiDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1024432422748160]SQL语句适配TiDB http://192.168.0.96:8090/demo/rdm.html#/task-detail/939050947543040/939050947543050/1024432422748160 --- .../dao/plugin/NeatLogicDatabaseIdProvider.java | 2 +- .../framework/store/mysql/DatabaseVendor.java | 10 +++++----- .../store/mysql/NeatLogicBasicDataSource.java | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java b/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java index 22eb0929a..abb3117a6 100644 --- a/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java +++ b/src/main/java/neatlogic/framework/dao/plugin/NeatLogicDatabaseIdProvider.java @@ -38,7 +38,7 @@ public class NeatLogicDatabaseIdProvider implements DatabaseIdProvider { private String getDatabaseName(DataSource dataSource) throws SQLException { DatabaseVendor vendor = getDatabaseVendor(dataSource); if (vendor != null) { - return vendor.getAlias(); + return vendor.getDatabaseId(); } return null; } diff --git a/src/main/java/neatlogic/framework/store/mysql/DatabaseVendor.java b/src/main/java/neatlogic/framework/store/mysql/DatabaseVendor.java index cd38b938c..df9c4a22a 100644 --- a/src/main/java/neatlogic/framework/store/mysql/DatabaseVendor.java +++ b/src/main/java/neatlogic/framework/store/mysql/DatabaseVendor.java @@ -7,18 +7,18 @@ public enum DatabaseVendor { ; String name; - String alias; + String databaseId; - DatabaseVendor(String name, String alias) { + DatabaseVendor(String name, String databaseId) { this.name = name; - this.alias = alias; + this.databaseId = databaseId; } public String getName() { return name; } - public String getAlias() { - return alias; + public String getDatabaseId() { + return databaseId; } } diff --git a/src/main/java/neatlogic/framework/store/mysql/NeatLogicBasicDataSource.java b/src/main/java/neatlogic/framework/store/mysql/NeatLogicBasicDataSource.java index 5d10f0b58..a343f445e 100644 --- a/src/main/java/neatlogic/framework/store/mysql/NeatLogicBasicDataSource.java +++ b/src/main/java/neatlogic/framework/store/mysql/NeatLogicBasicDataSource.java @@ -36,7 +36,7 @@ public class NeatLogicBasicDataSource extends HikariDataSource {//替换dbcp2的 Connection conn = super.getConnection(); conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); try (Statement statement = conn.createStatement()) { - if (Objects.equals(DatasourceManager.getDatabaseId(), DatabaseVendor.MYSQL.getAlias())) { + if (Objects.equals(DatasourceManager.getDatabaseId(), DatabaseVendor.MYSQL.getDatabaseId())) { //设置mysql join顺序优化器最大深度是5,避免大SQL分析时间过慢 statement.execute("SET SESSION optimizer_search_depth = 5"); //设置join_buffer为16M,提升BNL性能 -- Gitee