0

In a Java Application using DataDirect with Hibernate 5.4.18. Since the DataDirect driver (branded) needs to be unlocked, wrote a customer ConnectionProvider implementation. But the custom implementation is not getting invoked. Getting the following error:

Dec 02, 2020 7:56:13 AM org.hibernate.Version logVersion INFO: HHH000412: Hibernate ORM core version 5.4.18.Final
Dec 02, 2020 7:56:14 AM org.hibernate.engine.jdbc.spi.TypeInfo extractTypeInfo WARN: HHH000362: Unable to retrieve type info result set : java.sql.SQLException: [PostgreSQL JDBC Driver]This driver is locked for use with embedded applications. Dec 02, 2020 7:56:15 AM org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl sequenceInformationList ERROR: Could not fetch the SequenceInformation from the database java.sql.SQLException: [PostgreSQL JDBC Driver]This driver is locked for use with embedded applications. at com.wm.dd.jdbc.postgresqlbase.ddcp.b(Unknown Source) at com.wm.dd.jdbc.postgresqlbase.ddcp.a(Unknown Source) at com.wm.dd.jdbc.postgresqlbase.ddco.b(Unknown Source) at com.wm.dd.jdbc.postgresqlbase.ddco.a(Unknown Source) at com.wm.dd.jdbc.postgresqlbase.BaseConnection.createStatement(Unknown Source) at com.wm.dd.jdbc.postgresqlbase.BaseConnection.createStatement(Unknown Source) at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:40) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.sequenceInformationList(JdbcEnvironmentImpl.java:403) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.(JdbcEnvironmentImpl.java:268) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:114) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152) at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.(InFlightMetadataCollectorImpl.java:176) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473) at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689) at com.venkat.jdbc.JDBCManager.(JDBCManager.java:44) at com.venkat.jdbc.JDBCManager.main(JDBCManager.java:55)

Dec 02, 2020 7:56:15 AM org.hibernate.engine.jdbc.spi.TypeInfo extractTypeInfo WARN: HHH000362: Unable to retrieve type info result set : java.sql.SQLException: [PostgreSQL JDBC Driver]This driver is locked for use with embedded applications. SessionImpl(802771878)

My Connection Provider implementation

private class HibernateConnProvider implements ConnectionProvider {

private static final long serialVersionUID = -7281450846523561184L;
private ConnectionProvider provider;

HibernateConnProvider(ConnectionProvider delegate) {
    this.provider = delegate;
}

@Override
public boolean isUnwrappableAs(Class unwrapType) {
    return this.provider.isUnwrappableAs(unwrapType);
}

@Override
public <T> T unwrap(Class<T> unwrapType) {
    return this.provider.unwrap(unwrapType);
}

@Override
public Connection getConnection() throws SQLException {
    try {
        Connection result = this.provider.getConnection();
        Class<?> clazz = Class.forName("com.ddtek.jdbc.extensions.ExtEmbeddedConnection");

        Field field = result.getClass().getDeclaredField("inner");
        field.setAccessible(true);
        Object jdbcConnection = field.get(result);

        if (clazz.isAssignableFrom(jdbcConnection.getClass())) {
            System.out.println("Unlocking database embedded jdbc driver.");
            Method method = clazz.getMethod("unlock", String.class);
            method.invoke(jdbcConnection, "driver_passkey");
        }
        return result;
    } catch (Exception e) {
        throw new SQLException(e);
    }
}

@Override
public void closeConnection(Connection conn) throws SQLException {
    this.provider.closeConnection(conn);
}

@Override
public boolean supportsAggressiveRelease() {
    return this.provider.supportsAggressiveRelease();
}

}

Connection Provider invocation snippet is as follows:

        Properties settings = new Properties(); 
        settings.put(Environment.DRIVER, "com.wm.dd.jdbc.postgresql.PostgreSQLDriver");
        settings.put(Environment.URL, "jdbc:wm:postgresql://localhost:5432;DatabaseName=postgres");
        settings.put(Environment.USER, "dev_user");
        settings.put(Environment.PASS, "dev_user");
        settings.put(Environment.DIALECT, "org.hibernate.dialect.PostgreSQL95Dialect");
        settings.put(Environment.SHOW_SQL, "false");
        settings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
        settings.put(Environment.CACHE_PROVIDER_CONFIG, "org.hibernate.cache.internal.NoCachingRegionFactory");
        
        config.setProperties(settings);
        
        try {
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties())
 .build();

            ConnectionProvider connProvider = serviceRegistry.getService(ConnectionProvider.class);
            config.getStandardServiceRegistryBuilder().addService(ConnectionProvider.class, new HibernateConnProvider(connProvider)); 

            factory = config.buildSessionFactory(serviceRegistry);
        } catch (Exception e) {
            e.printStackTrace();
        }

Is there anything I'm missing in ConnectionProvider implementation? Anybody faced similar issue? Any help would be appreciated.

PS: When I attempt the unlock code-block with JDBC APIs/Unbranded driver, it works perfectly fine.

Venkat
  • 2,604
  • 6
  • 26
  • 36

1 Answers1

0

Try to set your ConnectionProvider with setting:

hibernate.connection.provider_class
A.Alexander
  • 588
  • 3
  • 14