You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keycloak 21.0.2开发环境启动失败问题咨询

解决Keycloak 21.0.2开发模式启动时JDBC连接超时问题

报错日志(中文翻译)

以下是启动时的完整报错日志:

C:\Program Files\keycloak-21.0.2\bin>kc.bat start-dev
2023-04-13 21:58:58,216 INFO  [org.keycloak.quarkus.runtime.hostname.DefaultHostnameProvider] (main) 主机名设置:基础URL:<未设置>,主机名:<请求>,严格HTTPS:false,路径:<请求>,严格BackChannel:false,管理URL:<未设置>,管理端:<请求>,端口:-1,代理模式:false
2023-04-13 21:59:01,941 WARN  [io.quarkus.agroal.runtime.DataSources] (main) 数据源<default>启用了XA但未启用事务恢复。请设置quarkus.transaction-manager.enable-recovery=true以启用事务恢复,否则应用突然终止可能导致数据丢失
2023-04-13 21:59:06,112 WARN  [org.infinispan.CONFIG] (keycloak-cache-init) ISPN000569:无法持久化Infinispan内部缓存,因为未启用全局状态
2023-04-13 21:59:06,241 WARN  [org.infinispan.PERSISTENCE] (keycloak-cache-init) ISPN000554:jboss-marshalling已被废弃,计划移除
2023-04-13 21:59:06,264 INFO  [org.infinispan.CONTAINER] (keycloak-cache-init) ISPN000556:启动用户编组器'org.infinispan.jboss.marshalling.core.JBossUserMarshaller'
2023-04-13 21:59:07,756 WARN  [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator] (JPA Startup Thread: keycloak-default) HHH000342:无法获取连接以查询元数据:java.sql.SQLException:获取新连接时超时
        at io.agroal.pool.ConnectionPool.handlerFromSharedCache(ConnectionPool.java:321)
        at io.agroal.pool.ConnectionPool.getConnection(ConnectionPool.java:249)
        at io.agroal.pool.DataSource.getConnection(DataSource.java:86)
        at io.quarkus.hibernate.orm.runtime.customized.QuarkusConnectionProvider.getConnection(QuarkusConnectionProvider.java:23)
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181)
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68)
        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.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
        at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
        at org.hibernate.boot.internal.SessionFactoryOptionsBuilder.<init>(SessionFactoryOptionsBuilder.java:272)
        at io.quarkus.hibernate.orm.runtime.recording.PrevalidatedQuarkusMetadata.buildSessionFactoryOptionsBuilder(PrevalidatedQuarkusMetadata.java:68)
        at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.build(FastBootEntityManagerFactoryBuilder.java:72)
        at io.quarkus.hibernate.orm.runtime.FastBootHibernatePersistenceProvider.createEntityManagerFactory(FastBootHibernatePersistenceProvider.java:72)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:80)
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
        at io.quarkus.hibernate.orm.runtime.JPAConfig$LazyPersistenceUnit.get(JPAConfig.java:165)
        at io.quarkus.hibernate.orm.runtime.JPAConfig$1.run(JPAConfig.java:66)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.util.concurrent.TimeoutException
        at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:204)
        at io.agroal.pool.ConnectionPool.handlerFromSharedCache(ConnectionPool.java:298)
        ... 23 more

2023-04-13 21:59:14,212 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR:无法以(开发)模式启动服务器
2023-04-13 21:59:14,212 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR:无法获取JDBC连接
2023-04-13 21:59:14,214 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR:获取新连接时超时
2023-04-13 21:59:14,214 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) 如需更多详情,请添加'--verbose'参数重新运行命令。也可使用'--help'查看具体命令的使用说明。

可能的解决方案

1. 检查数据库服务状态

  • 确认配置的数据库(默认H2,若已切换为MySQL/PostgreSQL等)是否正常运行。
  • 若为远程数据库,检查网络连通性,确保防火墙允许Keycloak访问数据库端口。

2. 验证数据库连接配置

  • 检查conf/keycloak.conf中的数据库连接参数:
    • db-url:JDBC URL是否正确,例如MySQL格式应为jdbc:mysql://localhost:3306/keycloak?useSSL=false
    • db-username和db-password:数据库账号密码是否正确,该账号需具备目标数据库的访问权限
  • 使用数据库客户端工具(如MySQL Workbench、psql)测试连接参数的有效性。

3. 调整连接池超时设置

  • 在conf/keycloak.conf中添加或修改以下参数,延长连接获取超时时间:
    quarkus.datasource.agroal.acquisition-timeout=30s
    quarkus.datasource.agroal.min-size=5
    quarkus.datasource.agroal.max-size=20
    
  • 保存配置后重启Keycloak。

4. 处理XA事务警告

  • 日志提示数据源启用XA但未开启事务恢复,可在conf/keycloak.conf中添加:
    quarkus.transaction-manager.enable-recovery=true
    
  • 该操作虽不直接解决连接超时问题,但可避免潜在的数据丢失风险。

5. 用内置H2数据库排查问题

  • 若之前配置了外部数据库,可先尝试用内置H2启动,排除外部数据库故障:
    • 执行命令:kc.bat start-dev --db=h2
    • 若能正常启动,说明问题出在外部数据库的配置或连接上。

内容的提问来源于stack exchange,提问作者Abhipransh Pratap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:53:10