Keycloak在数据库重启后无法连接外部数据库?

7
我们正在使用Keycloak 4.2.1.Final,我们发现了一些奇怪的问题。Keycloak正在使用外部数据库[Maria DB]。
如何重现这个问题?
1. 安装并运行Keycloak。 2. 使用外部数据库存储数据,我们使用mariadb。 3. Keycloak启动、MariaDB启动。 4. 现在停止Mariadb服务systemctl stop mariadb,然后启动Mariadbsystemctl start mariadb,检查keycloak不工作。 5. 尝试登录到keycloak https://localhost:8666/auth 并检查它不允许登录。 6. 在服务器日志中将显示连接已关闭。
解决方案1 -
在重新启动Mariadb后,必须同时启动Keycloak服务 service keycloak restart 然后Keycloak将开始正确响应。
但这不是一个可行的解决方案,我正在寻找一个适当的解决方案。有没有人遇到过或检查过这种问题?
2个回答

7

最终这个问题通过修改 Keycloak 的 Stanalone.xml 文件解决。你可以在以下位置找到该文件 /opt/keycloak/standalone/configuration/standalone.xml,需要将下面的行添加到该文件中。

 <validation>                   
       <check-valid-connection-sql>select 1</check-valid-connection-sql>
       <background-validation>true</background-validation>
       <background-validation-millis>15000</background-validation-millis>
    </validation>

在添加上述更改后,这些行应添加在<datasource/>标签内,<datasource/>将看起来像这样。
<datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true" use-java-context="true"> 
     <connection-url>jdbc:mariadb://localhost:3306/DBName?autoReconnect=true</connection-url>
           <driver>mariadb</driver> 
            <security> 
             <user-name>user</user-name> 
             <password>${VAULT::datasource::default-password::1}</password>
             </security>
             <validation>                     
             <check-valid-connection-sql>select 1</check-valid-connection-sql>
             <background-validation>true</background-validation>
              <background-validation-millis>15000</background-validation-millis>
              </validation>
</datasource>

我遇到了和你一模一样的问题,而且你的解决方案有效。但是,你介意解释一下为什么那些代码行起作用吗? - Henry

3

在添加验证检查后,Keycloak将在给定的时间间隔内保持对数据库连接的后台检查。因此,即使连接隧道断开,它也会重新连接到数据库。 如果未在数据源中进行验证,则一旦连接断开,它将无法重新连接。这就是为什么我们需要添加验证。

 <validation>                   
       <check-valid-connection-sql>select 1</check-valid-connection-sql>
       <background-validation>true</background-validation>
       <background-validation-millis>15000</background-validation-millis>
    </validation>

希望这能解决您的疑问。

好的澄清 - Subodh Joshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接