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 <[email protected]>
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;