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;

Reply via email to