diff --git a/src/main/java/META-INF/root-context.xml b/src/main/java/META-INF/root-context.xml index 60f38ce9aae994bfe16c4dd26434de3067ed113f..c8d5ba55d9bd90c1b09ce6a7dfcb89ccb6c1de17 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 e01091b78f861e2c2bb1c187a5df034bd1bb88a4..abb3117a62ef629d77f208bcb9bcfbea6bf36b53 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.getDatabaseId(); } - 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/DatabaseVendor.java b/src/main/java/neatlogic/framework/store/mysql/DatabaseVendor.java new file mode 100644 index 0000000000000000000000000000000000000000..df9c4a22aa3941c587b338623ea553ee268f0e5b --- /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 databaseId; + + DatabaseVendor(String name, String databaseId) { + this.name = name; + this.databaseId = databaseId; + } + + public String getName() { + return name; + } + + public String getDatabaseId() { + return databaseId; + } +} diff --git a/src/main/java/neatlogic/framework/store/mysql/DatasourceManager.java b/src/main/java/neatlogic/framework/store/mysql/DatasourceManager.java index d0b438eb73154ca288cda580e594ed330cafa078..0d26b7b48e36d39f5f335af3db526a3b9f145ece 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 72f0d0ce58d429b21c1814e19fc4b5ee02348553..a343f445e13a5a50118a4a48979b997c6371a393 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.getDatabaseId())) { + //设置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)) {