diff --git a/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlConnection.java b/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlConnection.java index b34008a..43a704f 100644 --- a/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlConnection.java +++ b/libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlConnection.java @@ -47,6 +47,7 @@ public class LibsqlConnection implements Connection { private int transactionIsolation = TRANSACTION_SERIALIZABLE; private boolean closed = false; private TransactionMode transactionMode = TransactionMode.DEFERRED; + private LibsqlDatabaseMetaData meta; /** * Transaction begin mode, matching xerial sqlite-jdbc's @@ -389,10 +390,19 @@ public boolean isClosed() throws SQLException { return closed; } + /** + * Returns the metadata for this connection, creating it on first use and reusing it afterwards, + * matching xerial sqlite-jdbc 3.53.4.0. The instance is cached for the lifetime of the + * connection, so repeated calls return the same object and separate connections get separate + * instances. Calling this on a closed connection throws. + */ @Override public DatabaseMetaData getMetaData() throws SQLException { checkClosed(); - return new LibsqlDatabaseMetaData(this); + if (meta == null) { + meta = new LibsqlDatabaseMetaData(this); + } + return meta; } @Override diff --git a/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlConnectionTest.java b/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlConnectionTest.java index 1153c5f..08c2988 100644 --- a/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlConnectionTest.java +++ b/libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlConnectionTest.java @@ -32,6 +32,17 @@ class LibsqlConnectionTest { private static final String SERVER_ERROR = "transaction end failed on server"; private static final String TRANSPORT_ERROR = "Connection reset by peer"; + @Test + void getMetaDataIsCachedPerConnection() throws SQLException { + LibsqlConnection connection = new LibsqlConnection( + CONFIG, new ScriptedClient((request, index) -> successResponse(request))); + LibsqlConnection other = new LibsqlConnection( + CONFIG, new ScriptedClient((request, index) -> successResponse(request))); + + assertThat(connection.getMetaData()).isSameAs(connection.getMetaData()); + assertThat(other.getMetaData()).isNotSameAs(connection.getMetaData()); + } + @Test void disablingAutoCommitBeginsTransactionImmediately() throws SQLException { ScriptedClient client = new ScriptedClient((request, index) -> successResponse(request));