This is an automated email from the ASF dual-hosted git repository. yuqi4733 pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push: new 5d0f1a76b5 [#6629] Improvement(jdbc-catalog): Optimize load database method in JdbcDatabaseOperations (#6642) 5d0f1a76b5 is described below commit 5d0f1a76b5f49dcd190c8e12cb75137a6b4e4e7c Author: Xiaojian Sun <sunxiaojian...@163.com> AuthorDate: Tue Mar 11 21:01:17 2025 +0800 [#6629] Improvement(jdbc-catalog): Optimize load database method in JdbcDatabaseOperations (#6642) <!-- 1. Title: [#<issue>] <type>(<scope>): <subject> Examples: - "[#123] feat(operator): support xxx" - "[#233] fix: check null before access result in xxx" - "[MINOR] refactor: fix typo in variable name" - "[MINOR] docs: fix typo in README" - "[#255] test: fix flaky test NameOfTheTest" Reference: https://www.conventionalcommits.org/en/v1.0.0/ 2. If the PR is unfinished, please mark this PR as draft. --> ### What changes were proposed in this pull request? Optimize load database method in JdbcDatabaseOperations ### Why are the changes needed? Fix: #6629 ### Does this PR introduce _any_ user-facing change? N/A ### How was this patch tested? N/A --- .../catalog/jdbc/operation/DatabaseOperation.java | 8 ++++++ .../jdbc/operation/JdbcDatabaseOperations.java | 32 ++++++++++++++++------ .../jdbc/operation/SqliteDatabaseOperations.java | 1 + .../operation/PostgreSqlSchemaOperations.java | 6 ++++ 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/DatabaseOperation.java b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/DatabaseOperation.java index 61c68b3a0c..65907a10f7 100644 --- a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/DatabaseOperation.java +++ b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/DatabaseOperation.java @@ -58,6 +58,14 @@ public interface DatabaseOperation { /** @return The list name of databases. */ List<String> listDatabases(); + /** + * Checks if the specified database exists. + * + * @param databaseName The name of the database to check. + * @return true if the database exists; false otherwise. + */ + boolean exist(String databaseName); + /** * @param databaseName The name of the database to check. * @return information object of the JDBC database. diff --git a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/JdbcDatabaseOperations.java b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/JdbcDatabaseOperations.java index a1e47e032c..35ffc49abf 100644 --- a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/JdbcDatabaseOperations.java +++ b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/operation/JdbcDatabaseOperations.java @@ -107,6 +107,25 @@ public abstract class JdbcDatabaseOperations implements DatabaseOperation { } } + @Override + public boolean exist(String databaseName) { + try (final Connection connection = this.dataSource.getConnection()) { + String query = generateDatabaseExistSql(databaseName); + try (Statement statement = connection.createStatement()) { + try (ResultSet resultSet = statement.executeQuery(query)) { + return resultSet.next(); + } + } + } catch (SQLException sqlException) { + throw this.exceptionMapper.toGravitinoException(sqlException); + } + } + + protected String generateDatabaseExistSql(String databaseName) { + return String.format( + "SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '%s'", databaseName); + } + protected void dropDatabase(String databaseName, boolean cascade) { try (final Connection connection = getConnection()) { JdbcConnectorUtils.executeUpdate(connection, generateDropDatabaseSql(databaseName, cascade)); @@ -176,16 +195,11 @@ public abstract class JdbcDatabaseOperations implements DatabaseOperation { */ @Override public JdbcSchema load(String databaseName) throws NoSuchSchemaException { - List<String> allDatabases = listDatabases(); - String dbName = - allDatabases.stream() - .filter(db -> db.equals(databaseName)) - .findFirst() - .orElseThrow( - () -> new NoSuchSchemaException("Database %s could not be found", databaseName)); - + if (!exist(databaseName)) { + throw new NoSuchSchemaException("Database %s could not be found", databaseName); + } return JdbcSchema.builder() - .withName(dbName) + .withName(databaseName) .withProperties(ImmutableMap.of()) .withAuditInfo(AuditInfo.EMPTY) .build(); diff --git a/catalogs/catalog-jdbc-common/src/test/java/org/apache/gravitino/catalog/jdbc/operation/SqliteDatabaseOperations.java b/catalogs/catalog-jdbc-common/src/test/java/org/apache/gravitino/catalog/jdbc/operation/SqliteDatabaseOperations.java index 48c2a56115..98f492a7ff 100644 --- a/catalogs/catalog-jdbc-common/src/test/java/org/apache/gravitino/catalog/jdbc/operation/SqliteDatabaseOperations.java +++ b/catalogs/catalog-jdbc-common/src/test/java/org/apache/gravitino/catalog/jdbc/operation/SqliteDatabaseOperations.java @@ -67,6 +67,7 @@ public class SqliteDatabaseOperations extends JdbcDatabaseOperations { Preconditions.checkArgument(exist(databaseName), "Database %s does not exist", databaseName); } + @Override public boolean exist(String databaseName) { return new File(dbPath + "/" + databaseName).exists(); } diff --git a/catalogs/catalog-jdbc-postgresql/src/main/java/org/apache/gravitino/catalog/postgresql/operation/PostgreSqlSchemaOperations.java b/catalogs/catalog-jdbc-postgresql/src/main/java/org/apache/gravitino/catalog/postgresql/operation/PostgreSqlSchemaOperations.java index be3c5d627d..7d24aca29b 100644 --- a/catalogs/catalog-jdbc-postgresql/src/main/java/org/apache/gravitino/catalog/postgresql/operation/PostgreSqlSchemaOperations.java +++ b/catalogs/catalog-jdbc-postgresql/src/main/java/org/apache/gravitino/catalog/postgresql/operation/PostgreSqlSchemaOperations.java @@ -155,6 +155,12 @@ public class PostgreSqlSchemaOperations extends JdbcDatabaseOperations { return connection; } + @Override + protected String generateDatabaseExistSql(String databaseName) { + return String.format( + "SELECT n.datname FROM pg_catalog.pg_database n where n.datname='%s'", databaseName); + } + @Override protected boolean supportSchemaComment() { return true;