r2dbc指定时区问题
问题 指定
2023-06-13 09:15:02 时间
政治能把一个人突然变老——巴尔扎克
今天看见这个警告
我的配置项如下:
import cn.hutool.core.util.StrUtil;
import com.alibaba.druid.util.JdbcUtils;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import io.r2dbc.spi.ConnectionFactories;
import io.r2dbc.spi.ConnectionFactory;
import io.r2dbc.spi.ConnectionFactoryOptions;
import io.r2dbc.spi.Option;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import java.time.Duration;
import java.util.Map;
import static io.r2dbc.spi.ConnectionFactoryOptions.*;
@Configuration
public class R2dbcConfig {
@Bean
public ConnectionFactory connectionFactory(DynamicDataSourceProperties dataSource) {
Map<String, DataSourceProperty> datasourceMap = dataSource.getDatasource();
DataSourceProperty master = datasourceMap.get("master");
String host = StrUtil.subBetween(master.getUrl(), "mysql://", ":");
String port = StrUtil.subBetween(master.getUrl(), host + ":", "/");
String database = StrUtil.subBetween(master.getUrl(), port + "/", "?");
ConnectionFactoryOptions options = ConnectionFactoryOptions.builder()
.option(DRIVER, JdbcUtils.MYSQL)
.option(HOST, host)
.option(USER, master.getUsername())
.option(PORT, Integer.valueOf(port)) // optional, default 3306
.option(PASSWORD, master.getPassword()) // optional, default null, null means has no password
.option(DATABASE, database) // optional, default null, null means not specifying the database
.option(CONNECT_TIMEOUT, Duration.ofSeconds(3)) // optional, default null, null means no timeout
.option(Option.valueOf("socketTimeout"), Duration.ofSeconds(4)) // optional, default null, null means no timeout
.option(SSL, false) // optional, default sslMode is "preferred", it will be ignore if sslMode is set
.option(Option.valueOf("zeroDate"), "use_null") // optional, default "use_null"
.option(Option.valueOf("useServerPrepareStatement"), true) // optional, default false
.option(Option.valueOf("tcpKeepAlive"), true) // optional, default false
.option(Option.valueOf("tcpNoDelay"), true) // optional, default false
.option(Option.valueOf("autodetectExtensions"), false) // optional, default false
.build();
ConnectionFactory connectionFactory = ConnectionFactories.get(options);
return connectionFactory;
}
}
我想到能在这里配置时区,于是按照警告提示的timezone
配置发现不生效、换成serverTimezone
依旧不行
搜issue
,没有(这里其实是搜错仓库了,正确的仓库是这个https://github.com/mirromutth/r2dbc-mysql ,在readme里就提到了时区配置)
翻阅文档,没找到:https://r2dbc.io/
看警告的代码行数dev.miku.r2dbc.mysql.MySqlConnection:451
然后发现调用convertZoneId
的地方在97
和100
行
于是debug
,这个timeZone
和systemTimeZone
都是从row
获取到的
看到确实拿到的是乱码
在row
里找到了zeroDateOption
,因为我们上面配置了zeroDate
为use_null
,我有印象
所以看到这里的serverZoneId
,就试着配置了一下
@Bean
public ConnectionFactory connectionFactory(DynamicDataSourceProperties dataSource) {
Map<String, DataSourceProperty> datasourceMap = dataSource.getDatasource();
DataSourceProperty master = datasourceMap.get("master");
String host = StrUtil.subBetween(master.getUrl(), "mysql://", ":");
String port = StrUtil.subBetween(master.getUrl(), host + ":", "/");
String database = StrUtil.subBetween(master.getUrl(), port + "/", "?");
ConnectionFactoryOptions options = ConnectionFactoryOptions.builder()
.option(DRIVER, JdbcUtils.MYSQL)
.option(HOST, host)
.option(USER, master.getUsername())
.option(PORT, Integer.valueOf(port)) // optional, default 3306
.option(PASSWORD, master.getPassword()) // optional, default null, null means has no password
.option(DATABASE, database) // optional, default null, null means not specifying the database
.option(CONNECT_TIMEOUT, Duration.ofSeconds(3)) // optional, default null, null means no timeout
.option(Option.valueOf("socketTimeout"), Duration.ofSeconds(4)) // optional, default null, null means no timeout
.option(SSL, false) // optional, default sslMode is "preferred", it will be ignore if sslMode is set
.option(Option.valueOf("zeroDate"), "use_null") // optional, default "use_null"
.option(Option.valueOf("useServerPrepareStatement"), true) // optional, default false
.option(Option.valueOf("tcpKeepAlive"), true) // optional, default false
.option(Option.valueOf("tcpNoDelay"), true) // optional, default false
.option(Option.valueOf("autodetectExtensions"), false) // optional, default false
.option(Option.valueOf("serverZoneId"), TimeZone.getTimeZone("GMT+8").getID()) // optional
.build();
ConnectionFactory connectionFactory = ConnectionFactories.get(options);
return connectionFactory;
}
然后生效了,不再打印该警告
后来发现github
人家写了配置项,我自己没找到
相关文章
- 鲲鹏arm64 centos7下官方二进制文件带证书https安装minio X509等问题解决实践
- git clone 显著提速,解决Github代码拉取速度缓慢问题[通俗易懂]
- 【Python问题解决】---- ERROR: Could not install packages due to an OSError: [WinError 2] 系统找不到指定的文件。
- 树莓派与1024x600分辨率屏幕的适配问题
- 关于 Fiori 应用里 SAP UI5 前端开发和 SEGW 后台 OData 服务开发的工作量比值问题
- 盘点Python词云制作过程中常见的一两个问题
- 记一次对接大疆SDK获取视频H.264问题过程
- 时间处理解决Java中Redis过期时间的问题(redisjava过期)
- 90分钟,17个问题带你深度了解精灵4无人机 | 雷锋网公开课
- 轻松访问Linux共享文件夹,快速解决文件共享问题(访问linux共享文件夹)
- 解决Linux Vi编辑器出现no的问题(linuxvino)
- 如何在Linux上给用户指定组? 快速解决用户组的问题(linux给用户指定组)
- Linux网络问题:无法ping通其他设备怎么办?(linux不能ping)
- 解决Oracle数据库超时设置问题(oracle 超时设置)
- 解决mysql不在指定时间段内工作的问题(mysql 不在时间段)
- Redis面试准备解答这些常见问题(redis面试常问题)
- 如何解决Oracle C长连接的问题(oracle c 长连接)
- IE8下关于querySelectorAll()的问题
- linux服务器中的远程访问问题小结
- Lua的迭代器使用中应该避免的问题和技巧