Wildfly 12 datasource JNDI lookup returning null
bowlerma Jun 20, 2018 3:40 PMWe've recently migrated to Wildfly 12 from Wildfly 10.1 and have started to see intermittent failures during startup due lookup of the datasource via JNDI returning null.
The datasource is configured within the standalone.xml file and looks like the following:
${env.CONN_URL} sqlserver TRANSACTION_READ_COMMITTED 0 0 50 false false encrypted-realm select 1 true 60000 1 12 5000 com.microsoft.sqlserver.jdbc.SQLServerDriver
We are using the old Picketbox module for encrypting the user/password. We are also using JBeret configured to store configuration within the ControlDB database.
We have the following defined with the persistence.xml file:
org.hibernate.jpa.HibernatePersistenceProvider java:jboss/datasources/ControlDB
We're using multi-tenancy and have a class that extends AbstractMultiTenantConnectionProvider whose constructor looks something like the following:
public class MultiTenantConnectionProvider extends AbstractMultiTenantConnectionProvider { public MultiTenantConnectionProvider() { DataSource ds = null; try { Context ctx = new InitialContext(); ds = (DataSource) ctx.lookup("java:jboss/datasources/ControlDB"); catch (NamingException e) { LOG.error("Naming Exception: ", e); } if (ds == null) { throw new IllegalArgumentException("No Control Database could be found"); } }
Every now and then Wildfly doesn't startup, it doesn't fail but appears to hang and we see the following exception in the logs:
2018-06-20 13:11:09,918 WARN [org.hibernate.engine.jdbc.connections.internal.MultiTenantConnectionProviderInitiator] (ServerService Thread Pool -- 58) Unable to instantiate specified class [com.test.multitenancy.MultiTenantConnectionProvider]: java.lang.IllegalArgumentException: No Control Database could be found at com.test.MultiTenantConnectionProvider.(MultiTenantConnectionProvider.java:61) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang.Class.newInstance(Class.java:442) at org.hibernate.engine.jdbc.connections.internal.MultiTenantConnectionProviderInitiator.initiateService(MultiTenantConnectionProviderInitiator.java:83) at org.hibernate.engine.jdbc.connections.internal.MultiTenantConnectionProviderInitiator.initiateService(MultiTenantConnectionProviderInitiator.java:28) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:254) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:228) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:207) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:149) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66) at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88) at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:254) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:228) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:207) at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51) at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:207) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:848) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:875) at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44) at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:167) at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:125) at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:650) at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:209) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378) at java.lang.Thread.run(Thread.java:748) at org.jboss.threads.JBossThread.run(JBossThread.java:485)
I've seen some old posts that imply that a resource-ref for the JNDI binding also needs to be created in a deployment descriptor, but am not sure if this is relevant, and why we would need to do this now since upgrading to WF12.
Any ideas?
Regards,
Mark