我正在寻找 jOOQ/HikariCP 连接池中 Spring
setDefaultTimeout
的 AbstractPlatformTransactionManager
方法的模拟。
我在
loginTimeout
中发现了各种超时,例如maxLifetime
、idleTimeout
和HikariDataSource
,但似乎都不符合我的目的。
我也看了jOOQ的
TransactionProvider
。
经过一些源代码调查后,我在 HikariCP 中发现了以下代码:
setNetworkTimeout(connection, validationTimeout);
try (Statement statement = connection.createStatement()) {
if (isNetworkTimeoutSupported != TRUE) {
setQueryTimeout(statement,
(int) MILLISECONDS.toSeconds(
Math.max(1000L, validationTimeout)));
}
statement.execute(config.getConnectionTestQuery());
}
看到这个,我想我想要的配置是
validationTimeout
。这是正确的吗?
您找到的代码是运行连接验证查询(通常非常快),其中应用了“验证超时”。
最有可能的是,“您的应用程序”中的事务将比为 HikariCP 指定的验证超时时间长得多
目前,您可以为org.jooq.Query设置查询超时,但不能为org.jooq.Routine设置查询超时。请参阅https://github.com/jOOQ/jOOQ/issues/3892
如果您引用 AbstractPlatformTransactionManager 我猜测您希望使用在 HikariCP 连接池之上使用 JOOQ 表达查询的事务。
最好的起点可能是 JOOQ 的交易文档在这里
http://www.jooq.org/doc/3.8/manual/sql-execution/transaction-management/
由于您来自 Spring,Spring TX 集成可能是一个很好的起点。
HikariCP 本身不提供超时管理,因为它只专注于管理已形成的连接。因此,您列出的 3 个值做了非常不同的事情
loginTimeout - HikariCP 等待与数据库建立连接(基本上是 JDBC 连接)的时间
maxLifetime - 连接在关闭之前在池中存活的时间
idleTimeout - 未使用的连接在池中存在多长时间