From 9e8797e374d6aeaad6f11e669bcae4a54d8be67e Mon Sep 17 00:00:00 2001 From: alexradzin Date: Thu, 11 Apr 2024 10:12:33 +0300 Subject: [PATCH] FIR-32085: cache Connection.getDatabaseMetaData() --- .../integration/tests/DatabaseMetaDataTest.java | 15 +++++++++++++++ .../jdbc/connection/FireboltConnection.java | 7 +++++++ .../FireboltConnectionServiceSecretTest.java | 7 +++++++ .../FireboltConnectionUserPasswordTest.java | 7 +++++++ 4 files changed, 36 insertions(+) diff --git a/src/integrationTest/java/integration/tests/DatabaseMetaDataTest.java b/src/integrationTest/java/integration/tests/DatabaseMetaDataTest.java index c3594fc73..fe732b913 100644 --- a/src/integrationTest/java/integration/tests/DatabaseMetaDataTest.java +++ b/src/integrationTest/java/integration/tests/DatabaseMetaDataTest.java @@ -57,8 +57,12 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; class DatabaseMetaDataTest extends IntegrationTest { @@ -73,6 +77,17 @@ void afterEach() { executeStatementFromFile("/statements/metadata/cleanup.sql"); } + @Test + void getMetadata() throws SQLException { + try (Connection connection = createConnection()) { + DatabaseMetaData databaseMetaData = connection.getMetaData(); + assertNotNull(databaseMetaData); + assertSame(databaseMetaData, connection.getMetaData()); + connection.close(); + assertThat(assertThrows(SQLException.class, connection::getMetaData).getMessage(), containsString("closed")); + } + } + @Test void shouldReturnSchema() throws SQLException { List schemas = new ArrayList<>(); diff --git a/src/main/java/com/firebolt/jdbc/connection/FireboltConnection.java b/src/main/java/com/firebolt/jdbc/connection/FireboltConnection.java index 990fb62c2..1525c8655 100644 --- a/src/main/java/com/firebolt/jdbc/connection/FireboltConnection.java +++ b/src/main/java/com/firebolt/jdbc/connection/FireboltConnection.java @@ -70,6 +70,7 @@ public abstract class FireboltConnection implements Connection { private int networkTimeout; private final String protocolVersion; protected int infraVersion = 1; + private volatile DatabaseMetaData databaseMetaData; //Properties that are used at the beginning of the connection for authentication protected final FireboltProperties loginProperties; @@ -158,6 +159,7 @@ protected void connect() throws SQLException { // The validation of not local DB is implemented into authenticate() method itself. assertDatabaseExisting(loginProperties.getDatabase()); } + databaseMetaData = retrieveMetaData(); log.debug("Connection opened"); } @@ -234,6 +236,10 @@ public boolean isClosed() { @Override public DatabaseMetaData getMetaData() throws SQLException { validateConnectionIsNotClose(); + return databaseMetaData; + } + + private DatabaseMetaData retrieveMetaData() { if (!loginProperties.isSystemEngine()) { return new FireboltDatabaseMetadata(httpConnectionUrl, this); } else { @@ -321,6 +327,7 @@ public void close() { } statements.clear(); } + databaseMetaData = null; log.debug("Connection closed"); } diff --git a/src/test/java/com/firebolt/jdbc/connection/FireboltConnectionServiceSecretTest.java b/src/test/java/com/firebolt/jdbc/connection/FireboltConnectionServiceSecretTest.java index c2a464c3b..a5dc70f0d 100644 --- a/src/test/java/com/firebolt/jdbc/connection/FireboltConnectionServiceSecretTest.java +++ b/src/test/java/com/firebolt/jdbc/connection/FireboltConnectionServiceSecretTest.java @@ -5,6 +5,7 @@ import com.firebolt.jdbc.connection.settings.FireboltProperties; import com.firebolt.jdbc.exception.FireboltException; import com.firebolt.jdbc.service.FireboltGatewayUrlService; +import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -17,7 +18,10 @@ import static java.lang.String.format; import static java.util.stream.Collectors.toMap; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.argThat; @@ -76,6 +80,9 @@ void getMetadata(String testName, String engineParameter, boolean readOnly) thro try (FireboltConnection connection = createConnection(format("jdbc:firebolt:db?env=dev&account=dev%s", engineParameter), connectionProperties)) { DatabaseMetaData dbmd = connection.getMetaData(); assertEquals(readOnly, dbmd.isReadOnly()); + assertSame(dbmd, connection.getMetaData()); + connection.close(); + assertThat(assertThrows(SQLException.class, connection::getMetaData).getMessage(), containsString("closed")); } } diff --git a/src/test/java/com/firebolt/jdbc/connection/FireboltConnectionUserPasswordTest.java b/src/test/java/com/firebolt/jdbc/connection/FireboltConnectionUserPasswordTest.java index bfb8908d2..05126abcc 100644 --- a/src/test/java/com/firebolt/jdbc/connection/FireboltConnectionUserPasswordTest.java +++ b/src/test/java/com/firebolt/jdbc/connection/FireboltConnectionUserPasswordTest.java @@ -10,9 +10,13 @@ import static com.firebolt.jdbc.connection.FireboltConnectionUserPassword.SYSTEM_ENGINE_NAME; import static java.lang.String.format; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -61,6 +65,9 @@ void getMetadata(String engine, boolean readOnly) throws SQLException { try (FireboltConnection connection = createConnection(format("jdbc:firebolt:db?env=dev&engine=%s&account=dev", engine), connectionProperties)) { DatabaseMetaData dbmd = connection.getMetaData(); assertEquals(readOnly, dbmd.isReadOnly()); + assertSame(dbmd, connection.getMetaData()); + connection.close(); + assertThat(assertThrows(SQLException.class, connection::getMetaData).getMessage(), containsString("closed")); } }