Using Oracle 19 like keycloak database

Hi to all, I’m trying to configure oracle 19 like keycloak DB.
I’ve follow several guide.
I have download the oracle driver and put it in the modules\system\layers\keycloak\com\oracle\main directory, create in that directory the module.xml file in this way:

<?xml version=”1.0" ?>
<module xmlns=”urn:jboss:module:1.3" name=”com.oracle”>
 <resources>
 <resource-root path=”ojdbc8.jar”/>
 </resources>
 <dependencies>
 <module name=”javax.api”/>
 <module name=”javax.transaction.api”/>
 </dependencies>
</module>

after this I’ve create a driver in standalone.xml :slight_smile:

  </driver>
						<driver name="oracle" module="com.oracle">
					      <xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
					     </driver>

and change the keycloakDS in this way:

<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true" statistics-enabled="${wildfly.datasources.statistics-enabled:${wildfly.statistics-enabled:false}}">
					 <connection-url>jdbc:oracle:thin:@localhost:1521/orcl</connection-url>
					 <driver>oracle</driver>
					 <security>
					  <user-name>****</user-name>
					  <password>*****</password>
					 </security>
					 <!--<validation>
					  <background-validation>true</background-validation>
					  <background-validation-millis>60000</background-validation-millis>
					 </validation>-->
					 <pool>
					  <max-pool-size>20</max-pool-size>
					 </pool>
</datasource>

I’ve used the correct credential. with other tools on the same server I can enter in my db.

when keycloak starts I’ve this error:

12:09:53,123 FATAL [org.keycloak.services] (ServerService Thread Pool -- 61) Error during startup: java.lang.RuntimeException: Failed to connect to database
        at org.keycloak.keycloak-model-jpa@19.0.2//org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getConnection(DefaultJpaConnectionProviderFactory.java:420)
        at org.keycloak.keycloak-model-jpa@19.0.2//org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.lazyInit(LiquibaseDBLockProvider.java:65)
        at org.keycloak.keycloak-model-jpa@19.0.2//org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.lambda$waitForLock$2(LiquibaseDBLockProvider.java:96)
        at org.keycloak.keycloak-server-spi-private@19.0.2//org.keycloak.models.utils.KeycloakModelUtils.suspendJtaTransaction(KeycloakModelUtils.java:751)
        at org.keycloak.keycloak-model-jpa@19.0.2//org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider.waitForLock(LiquibaseDBLockProvider.java:94)
        at org.keycloak.keycloak-services@19.0.2//org.keycloak.services.resources.KeycloakApplication$1.run(KeycloakApplication.java:135)
        at org.keycloak.keycloak-server-spi-private@19.0.2//org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:250)
        at org.keycloak.keycloak-services@19.0.2//org.keycloak.services.resources.KeycloakApplication.startup(KeycloakApplication.java:129)
        at org.keycloak.keycloak-wildfly-extensions@19.0.2//org.keycloak.provider.wildfly.WildflyPlatform.onStartup(WildflyPlatform.java:47)
        at org.keycloak.keycloak-services@19.0.2//org.keycloak.services.resources.KeycloakApplication.<init>(KeycloakApplication.java:115)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:484)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.core.ConstructorInjectorImpl.constructOutsideRequest(ConstructorInjectorImpl.java:225)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:209)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.core.providerfactory.Utils.createProviderInstance(Utils.java:102)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.core.providerfactory.ResteasyProviderFactoryImpl.createProviderInstance(ResteasyProviderFactoryImpl.java:1385)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.core.ResteasyDeploymentImpl.createApplication(ResteasyDeploymentImpl.java:418)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.core.ResteasyDeploymentImpl.initializeObjects(ResteasyDeploymentImpl.java:265)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.core.ResteasyDeploymentImpl.startInternal(ResteasyDeploymentImpl.java:137)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.core.ResteasyDeploymentImpl.start(ResteasyDeploymentImpl.java:121)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:144)
        at org.jboss.resteasy.resteasy-core@4.7.6.Final//org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:42)
        at io.undertow.servlet@2.2.17.Final//io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)
        at org.wildfly.security.elytron-web.undertow-server-servlet@1.10.1.Final//org.wildfly.elytron.web.undertow.server.servlet.RunAsLifecycleInterceptor.doIt(RunAsLifecycleInterceptor.java:70)
        at org.wildfly.security.elytron-web.undertow-server-servlet@1.10.1.Final//org.wildfly.elytron.web.undertow.server.servlet.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:76)
        at io.undertow.servlet@2.2.17.Final//io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103)
        at io.undertow.servlet@2.2.17.Final//io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:309)
        at io.undertow.servlet@2.2.17.Final//io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:145)
        at io.undertow.servlet@2.2.17.Final//io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:588)
        at io.undertow.servlet@2.2.17.Final//io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:559)
        at io.undertow.servlet@2.2.17.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
        at io.undertow.servlet@2.2.17.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
        at org.wildfly.extension.undertow@26.1.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)
        at org.wildfly.extension.undertow@26.1.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)
        at org.wildfly.extension.undertow@26.1.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)
        at org.wildfly.extension.undertow@26.1.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)
        at io.undertow.servlet@2.2.17.Final//io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:601)
        at org.wildfly.extension.undertow@26.1.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:106)
        at org.wildfly.extension.undertow@26.1.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:87)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
        at java.base/java.lang.Thread.run(Thread.java:1589)
        at org.jboss.threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513)
Caused by: javax.naming.NameNotFoundException: datasources/KeycloakDS [Root exception is java.lang.IllegalStateException]
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:152)
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:83)
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.NamingContext.lookup(NamingContext.java:184)
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:239)
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193)
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189)
        at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
        at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
        at org.keycloak.keycloak-model-jpa@19.0.2//org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.getConnection(DefaultJpaConnectionProviderFactory.java:413)
        ... 47 more
Caused by: java.lang.IllegalStateException
        at org.jboss.msc@1.4.13.Final//org.jboss.msc.value.InjectedValue.getValue(InjectedValue.java:50)
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.service.BinderService.getValue(BinderService.java:148)
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.service.BinderService.getValue(BinderService.java:46)
        at org.jboss.msc@1.4.13.Final//org.jboss.msc.service.ServiceControllerImpl.getValue(ServiceControllerImpl.java:1109)
        at org.jboss.as.naming@26.1.1.Final//org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:130)
        ... 56 more

any idea?

I’ve try several ojdbc driver taken from oracle site but with no success…

thanks!

It looks like you are using the wrong approach to configure keycloak, since keycloak 18 this has changed a lot (done via arguments to kc.sh build and/or start, not via xml). If oracle is not included in the provided builtin adapaters (it should be included) you may need to build your own jar (check GitHub - thomasdarimont/keycloak-custom-server: Custom Keycloak.X Server Distribution with selective features for a starting point=

thanks for reply, you are correct but I’m still using the wildfly version, I’m planning to migrate to quarkus version as soon as possible.