Skip to content

fix(jdbc): cache database metadata per connection - #94

Merged
magnusp merged 1 commit into
mainfrom
fix/50-metadata-caching
Oct 22, 2026
Merged

magnusp merged 1 commit into
mainfrom
fix/50-metadata-caching

Conversation

@magnusp

@magnusp magnusp commented Oct 22, 2026

Copy link
Copy Markdown
Owner

Closes #50

Part of #54.

What changed

LibsqlConnection.getMetaData() now creates LibsqlDatabaseMetaData on first use and returns the same instance for the lifetime of the connection. Separate connections get separate instances. A closed connection still throws. The method Javadoc documents the caching contract.

The behavior test LibsqlConnectionTest#getMetaDataIsCachedPerConnection pins both halves: repeated calls on one connection return the same object, and another connection returns a different object.

Contract decision

Parity with xerial sqlite-jdbc 3.53.4.0. SQLiteConnection.getSQLiteDatabaseMetaData() caches its metadata object in a meta field and getMetaData() delegates to it, so the same instance is returned per connection. This change matches that behavior. No Hrana or sqld constraint makes parity impossible.

Evidence

Failing before the fix:

./mvnw -q -pl libsql-jdbc -am -Dtest=LibsqlConnectionTest#getMetaDataIsCachedPerConnection -Dsurefire.failIfNoSpecifiedTests=false test
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
java.lang.AssertionError:
Expecting actual:
  com.github.magnusp.libsql.jdbc.LibsqlDatabaseMetaData@58c34bb3
and:
  com.github.magnusp.libsql.jdbc.LibsqlDatabaseMetaData@56a4479a
to refer to the same object

Passing after the fix:

./mvnw -q -pl libsql-jdbc -am -Dtest=LibsqlConnectionTest#getMetaDataIsCachedPerConnection -Dsurefire.failIfNoSpecifiedTests=false test

No failures (exit 0).

Full module suite after the fix:

./mvnw -pl libsql-jdbc -am test
Tests run: 170, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS

Formatting:

./mvnw spotless:apply
BUILD SUCCESS

libsql-itests and libsql-conformance were not run: the #50 Steering evidence asks for ./mvnw -pl libsql-jdbc -am test and ./mvnw spotless:apply, and this change touches no live-sqld or conformance path.

Deviations

None.

Defect coverage

This is defect (4) of the four sequenced defects under #50: getMetaData caching. It does not reopen the earlier three defects, which were delivered in #90 (getTableTypes), #91 (statement leaks), and #93 (getIndexInfo escaping).

Files touched:

  • libsql-jdbc/src/main/java/com/github/magnusp/libsql/jdbc/LibsqlConnection.java
  • libsql-jdbc/src/test/java/com/github/magnusp/libsql/jdbc/LibsqlConnectionTest.java

@magnusp
magnusp merged commit dca0037 into main Oct 22, 2026
5 checks passed
@magnusp
magnusp deleted the fix/50-metadata-caching branch October 22, 2026 00:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

getTableTypes is incomplete and several metadata methods leak statements

1 participant