JBOSS EAP 6.3.0: Database Connection pool through LDAP throws exception at server startup when "prefill" option is set to true
rubyjb Mar 10, 2015 11:59 AMHello,
We have our JBOSS EAP 6.3.0 server set as a managed domain. We are setting up the connection pool to Oracle database through LDAP using an URL as follows:
jdbc:oracle:thin:@ldap://<ldap server>:<ldap port>/<oracle db name>,cn=OracleContext,dc=xx,dc=yy,dc=com
The pool is setup with "prefill" option set to true.
Our pool configuration in domain.xml looks like below -
<datasource jta="false" jndi-name="java:jboss/test/jdbc/testdb" pool-name="testJDBCPool" enabled="true" use-ccm="false"> <connection-url>jdbc:oracle:thin:@ldap://<ldap server>:<ldap port>/<oracle db name>,cn=OracleContext,dc=xx,dc=yy,dc=com</connection-url> <driver-class>oracle.jdbc.OracleDriver</driver-class> <driver>ojdbc6</driver> <new-connection-sql>select 1 from dual</new-connection-sql> <pool> <min-pool-size>1</min-pool-size> <max-pool-size>50</max-pool-size> <prefill>true</prefill> <use-strict-min>true</use-strict-min> </pool> <security> <user-name>testusername</user-name> <password>testpassword</password> </security> <validation> <check-valid-connection-sql>select 1 from dual</check-valid-connection-sql> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> </validation> <timeout> <set-tx-query-timeout>false</set-tx-query-timeout> <blocking-timeout-millis>0</blocking-timeout-millis> <idle-timeout-minutes>15</idle-timeout-minutes> <query-timeout>0</query-timeout> <use-try-lock>0</use-try-lock> <allocation-retry>5</allocation-retry> <allocation-retry-wait-millis>1000</allocation-retry-wait-millis> </timeout> <statement> <prepared-statement-cache-size>10</prepared-statement-cache-size> <share-prepared-statements>false</share-prepared-statements> </statement> </datasource> <drivers> <driver name="h2" module="com.h2database.h2"> <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class> </driver> <driver name="ojdbc6" module="com.oracle.db"> <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class> </driver> </drivers> </datasources>
When the server starts, we are getting following exception -
2015-03-09 13:46:16,120 WARN [org.jboss.jca.core.connectionmanager.pool.strategy.OnePool] (JCA PoolFiller) IJ000610: Unable to fill pool: javax.resource.ResourceException: Could not create connection
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:324)
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:281)
at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.createConnectionEventListener(SemaphoreArrayListManagedConnectionPool.java:842) [ironjacamar-core-impl-1.0.26.Final-redhat-1.jar:1.0.26.Final-redhat-1]
at org.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.fillToMin(SemaphoreArrayListManagedConnectionPool.java:783) [ironjacamar-core-impl-1.0.26.Final-redhat-1.jar:1.0.26.Final-redhat-1]
at org.jboss.jca.core.connectionmanager.pool.mcp.PoolFiller.run(PoolFiller.java:97) [ironjacamar-core-impl-1.0.26.Final-redhat-1.jar:1.0.26.Final-redhat-1]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_71]
Caused by: java.sql.SQLRecoverableException: IO Error: JNDI Package failure javax.naming.NamingException: JBAS011843: Failed instantiate InitialContextFactory com.sun.jndi.ldap.LdapCtxFactory from classloader ModuleClassLoader for Module "org.jboss.ironjacamar.impl:main" from local module loader @1a46db0d (finder: local module finder @21d73ff5 (roots: /opt/app/workload/app/jboss630/jbdomain/modules,/opt/app/workload/app/jboss630/jbdomain/modules/system/layers/base)) [Root exception is javax.naming.CommunicationException: odmsvr.sbc.com:3060 [Root exception is java.net.ConnectException: Connection timed out]]
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:475)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:552)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:253)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:526)
at org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory.getLocalManagedConnection(LocalManagedConnectionFactory.java:296)
... 5 more
Caused by: oracle.net.ns.NetException: JNDI Package failure javax.naming.NamingException: JBAS011843: Failed instantiate InitialContextFactory com.sun.jndi.ldap.LdapCtxFactory from classloader ModuleClassLoader for Module "org.jboss.ironjacamar.impl:main" from local module loader @1a46db0d (finder: local module finder @21d73ff5 (roots: /opt/app/workload/app/jboss630/jbdomain/modules,/opt/app/workload/app/jboss630/jbdomain/modules/system/layers/base)) [Root exception is javax.naming.CommunicationException: odmsvr.sbc.com:3060 [Root exception is java.net.ConnectException: Connection timed out]]
at oracle.net.jndi.JndiAttrs.<init>(JndiAttrs.java:161)
at oracle.net.resolver.AddrResolution.<init>(AddrResolution.java:193)
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:219)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1126)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:337)
... 10 more
However, if the "prefill" is set to false OR if the connection to OracleDB is direct (i.e., not through the LDAP), then the pool starts up fine.
After digging for some time, I came up with a fix as follows -
In module.xml in <EAP_HOME>/modules/system/layers/base/org/jboss/ironjacamar/impl/main, I added the following dependency (highlighted) -
<dependencies>
<!-- javax.security.auth.callback -->
<module name="sun.jdk"/>
<module name="javax.api"/>
<module name="javax.resource.api"/>
<module name="javax.security.auth.message.api"/>
With the above dependency in place, the server starts up fine and the pool is correctly filled up with the "prefill" option.
So here are my questions -
- Has anyone faced the same problem with the pool with LDAP and prefill together in the mix or is there something wrong with my configuration?
- The fix that I did, is this correct? It works, but want to know whether it can cause issues anywhere else. This question is really for JBOSS experts to validate if the fix is correct or whether they have any better solution.
This is my first post to this forum, so apologize if the above info is not adequate.
Thank you.