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=falsedb-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
相关产品推荐
相关产品推荐

