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.