为什么r2dbc-spi的connectTimeout属性的类型为java.time.Duration,以及如何在URL连接中使用它?

问题描述

我正在将URL连接与application.yml文件一起用于r2dbc连接。 我尝试设置connectTimeout属性,但出现此错误

Caused by: java.lang.classCastException: class java.lang.String cannot be cast to class java.time.Duration (java.lang.String and java.time.Duration are in module java.base of loader 'bootstrap')

,然后检查r2dbc-spi是否将connectTimeout的类型配置为java.time.Duration。而我正在使用的r2dbc-MysqL紧随其后。

我可以通过URL方式使用connectTimeout属性吗?我不知道如何自动将其从字符串传输到java.time.Duration

到目前为止,我看到大多数类型的连接属性值是字符串,整数,布尔值。据我所知,JDBC将connectTimeout的单位配置为ms,因此我可以轻松地将connectTimeout设置为URL。 r2dbc-spi是否为此选择了Duration类型?

解决方法

我发现,它从0.8.2.RELEASE解析了DurationStr,因此使用PnDTnHnMn.nS格式设置connectTimeout是可行的。

在MySqlConnectionFactoryProvider.java中:

mapper.from(CONNECT_TIMEOUT).asInstance(Duration.class,Duration::parse)
    .into(builder::connectTimeout);

有一件事是,在0.8.2下,它没有实现,但是我的pom.xml导入了0.8.1.RELEASE和0.8.2.RELEASE,尽管我没有定义任何0.8.1东西。所以spring用0.8.1

r2dbc:pool:mysql://host:port/db?connectTimeout=PT3S // 3 seconds