如何在 Quarkus 中启用连接池容错?

问题描述 投票:0回答:2

我正在使用 MSSqlserver 和 Jtds 驱动程序开发 quarkus (2.16.5) 应用程序。

不幸的是,虽然我已经配置了 validation-querybackground-validation 属性,但当网络出现故障并在稍后恢复时,我仍然处于无效状态的连接。

为了提高可靠性,有办法(配置)防止quarkus应用程序使用无效连接并将其从池中删除吗?

错误

Caused by: java.sql.SQLException: Invalid state, the Connection object is closed.
    at net.sourceforge.jtds.jdbc.JtdsConnection.checkOpen(JtdsConnection.java:1744)
    at net.sourceforge.jtds.jdbc.JtdsConnection.prepareStatement(JtdsConnection.java:2448)
    at io.agroal.pool.wrapper.ConnectionWrapper.prepareStatement(ConnectionWrapper.java:658)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176)

数据源配置:

quarkus.datasource.jdbc.min-size=5
quarkus.datasource.jdbc.max-size=20
quarkus.datasource.jdbc.initial-size=5
quarkus.datasource.jdbc.acquisition-timeout=10
quarkus.datasource.jdbc.background-validation-interval=5
quarkus.datasource.jdbc.validation-query-sql=SELECT 1
quarkus.transaction-manager.default-transaction-timeout=600

quarkus.datasource.db-kind=other 
quarkus.datasource.username=sa
quarkus.datasource.password=123456
quarkus.datasource.jdbc.url=jdbc:jtds:sqlserver://sqlserver-local/MYDB;
quarkus.datasource.jdbc.driver=net.sourceforge.jtds.jdbc.Driver
quarkus.hibernate-orm.dialect=org.hibernate.dialect.SQLServerDialect

POM 的依赖项

<dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-resteasy-reactive-jsonb</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-arc</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-resteasy-reactive</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-elytron-security-ldap</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-hibernate-orm</artifactId>
        </dependency>
        <dependency>
            <groupId>io.quarkus</groupId>
            <artifactId>quarkus-narayana-jta</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.jtds</groupId>
            <artifactId>jtds</artifactId>
            <version>1.3.1</version>
        </dependency>
java hibernate jdbc quarkus agroal
2个回答
0
投票

官方驱动程序的 JDBC 扩展设置了一个

ExceptionSorter
来更快地刷新这些连接。该机制可用于自定义
JTDS
驱动程序的扩展

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-jdbc-mssql</artifactId>
</dependency>

否则,您可以减少后台验证间隔。

请注意,在这些场景中无法确保 100% 的可靠性,因为连接可能会通过验证,但之后仍然会失败。


0
投票

我在生产中有以下设置,当我们的数据库集群有时失败时它可以工作:

quarkus.datasource.jdbc.max-lifetime=5M
quarkus.datasource.jdbc.idle-removal-interval=3M
quarkus.datasource.jdbc.validation-query-sql=select 1

您也可以自己测试它,通过docker启动应用程序和数据库,然后杀死数据库并重新启动数据库,看看您的应用程序是否仍然有效。

© www.soinside.com 2019 - 2024. All rights reserved.