Java based connectivity drivers

Michael Stahl mstahl at
Fri Jan 13 14:09:45 UTC 2017

On 13/01/17 13:44, Bunth Tamás wrote:
> Hi,
> I'd like to have a better understanding of how the hsqldb and jdbc drivers work.
> Is there any wiki page for them like "FirebirdSQL" for firebird that I
> couldn't find?

maybe there's some old page somewhere here

> The code in connectivity/source/drivers/jdbc contains a bunch of java
> function calls afais. So where are the java codes, and how does the
> driver call them?

it looks like the jdbc driver uses JNI to call Java methods directly
from C++.

like this, the strings are method name and signature:

        jobject out =
callObjectMethod(t.pEnv,"getMetaData","()Ljava/sql/DatabaseMetaData;", mID)

i think there's some generic JDBC implementation in the JRE plus a
driver-specific part in the JDBC driver.

so for the hsqldb case, i would expect this to call into here:

  public synchronized DatabaseMetaData getMetaData() throws SQLException {

another point is that we have (at least on Linux) segregated the JDBC
driver into a separate thread for performance reasons, as it turned out
that JNI calls on the main thread happen to be really slow.

see jdbc.component:

    environment="@CPPU_ENV@:affine" prefix="jdbc"

this means that every UNO call first goes via the affine UNO-UNO bridge
onto a separate thread into the C++ JDBC UNO component, then that calls
via JNI into the Java library, then the return value of that is
converted with some C++ UNO wrapper, then it goes back over the bridge
to the calling thread.

More information about the LibreOffice mailing list