我正在使用 MSSqlserver 和 Jtds 驱动程序开发 quarkus (2.16.5) 应用程序。
不幸的是,虽然我已经配置了 validation-query 和 background-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>
官方驱动程序的 JDBC 扩展设置了一个
ExceptionSorter
来更快地刷新这些连接。该机制可用于自定义 JTDS
驱动程序的扩展
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-mssql</artifactId>
</dependency>
否则,您可以减少后台验证间隔。
请注意,在这些场景中无法确保 100% 的可靠性,因为连接可能会通过验证,但之后仍然会失败。
我在生产中有以下设置,当我们的数据库集群有时失败时它可以工作:
quarkus.datasource.jdbc.max-lifetime=5M
quarkus.datasource.jdbc.idle-removal-interval=3M
quarkus.datasource.jdbc.validation-query-sql=select 1
您也可以自己测试它,通过docker启动应用程序和数据库,然后杀死数据库并重新启动数据库,看看您的应用程序是否仍然有效。