前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >r2dbc指定时区问题

r2dbc指定时区问题

作者头像
阿超
发布于 2022-11-12 05:37:49
发布于 2022-11-12 05:37:49
93900
代码可运行
举报
文章被收录于专栏:快乐阿超快乐阿超
运行总次数:0
代码可运行

政治能把一个人突然变老——巴尔扎克

今天看见这个警告

我的配置项如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的地方在97100

于是debug,这个timeZonesystemTimeZone都是从row获取到的

看到确实拿到的是乱码

row里找到了zeroDateOption,因为我们上面配置了zeroDateuse_null,我有印象

所以看到这里的serverZoneId,就试着配置了一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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人家写了配置项,我自己没找到

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解r2dbc-mysql
mysql应该是我们在日常工作中使用到的一个非常普遍的数据库,虽然mysql现在是oracle公司的,但是它是开源的,市场占有率还是非常高的。
程序那些事
2020/11/26
1.2K0
深入理解h2和r2dbc-h2
本文将会介绍R2DBC的H2实现r2dbc-h2的使用方法和要注意的事项。一起来看看吧。
程序那些事
2020/11/26
1.1K0
响应式关系数据库处理R2DBC
之前我们提到过,对于底层的数据源来说,MongoDB, Redis, 和 Cassandra 可以直接以reactive的方式支持Spring Data。而其他很多关系型数据库比如Postgres, Microsoft SQL Server, MySQL, H2 和 Google Spanner 则可以通过使用R2DBC 来实现对reactive的支持。
程序那些事
2020/11/26
9830
r2dbc配置枚举转换器
阿超
2024/03/05
1960
r2dbc事务处理
https://github.com/spring-projects/spring-data-examples/blob/main/r2dbc/example/src/main/java/example/springdata/r2dbc/basics/TransactionalService.java
阿超
2023/10/31
3750
r2dbc分页条件查询
这里repository需要继承org.springframework.data.repository.query.ReactiveQueryByExampleExecutor
阿超
2023/10/30
4980
Spring认证中国教育管理中心-Spring Data R2DBC框架教程一
原标题:Spring认证中国教育管理中心-Spring Data R2DBC框架教程一(Spring中国教育管理中心)
IT胶囊
2021/12/06
4540
Spring认证中国教育管理中心-Spring Data R2DBC框架教程一
mybatis-plus多数据源解析
上一篇文章大致介绍了dynamic-datasource的功能,用起来的确很方便,只需要一个@DS注解,加上一些简单的配置即可完成多数据源的切换。究竟是怎么做到的呢,底层是怎么实现呢?带着这个疑问,一起研究了一下源码。
java技术爱好者
2021/11/02
1.3K0
mybatis-plus多数据源解析
r2dbc自动填充审计字段
在r2dbc中自动填充审计字段可以使用org.springframework.data.annotation.CreatedDate注解
阿超
2024/03/19
1360
r2dbc的repository注入失败
原来是需要在实体类上加@Table注解或者接口继承R2dbcRepository。。。
阿超
2023/10/29
3310
SpringBoot使用Sharding-JDBC分库分表
有关Sharding-JDBC介绍这里就不在多说,之前Sharding-JDBC是当当网自研的关系型数据库的水平扩展框架,现在已经捐献给Apache,具体可以查看Github,地址是
lyb-geek
2019/03/07
1.3K0
SpringBoot使用Sharding-JDBC分库分表
只会JDBC连接MySQL?来试试R2DBC吧
尽管一些NoSQL数据库供应商为其数据库提供了反应式数据库客户端,但对于大多数项目而言,迁移到NoSQL并不是一个理想的选择。这促使了一个通用的响应式关系数据库连接规范的诞生。作为拥有庞大用户群的关系式数据库MySQL也有了反应式驱动,不过并不是官方的。但是Spring官方将其纳入了依赖池,说明该类库的质量并不低。所以今天就尝尝鲜,试一下使用R2DBC连接MySQL。
码农小胖哥
2020/06/28
1.9K0
SpringBoot 2.x 使用Redis作为缓存 设置有效时间及自动更新策略
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/31
8.1K0
带Lettuce连接池、多数据源配置的RedisTemplate方案
在现实项目中,我们往往会遇到需要使用多个Redis数据源的场景。本文介绍的是一种高度定制化的方案。每个独立的数据源都会使用自己的配置,其中包括针对该数据源的连接池配置。 要完成这个功能,需要解决几个基础能力:
方亮
2024/05/24
5850
Spring Boot MyBatis 动态数据源切换、多数据源,读写分离
项目地址: https://github.com/helloworlde/SpringBoot-DynamicDataSource
JAVA葵花宝典
2019/06/11
1.9K0
在Spring data中使用r2dbc
上篇文章我们讲到了怎么在Spring webFlux中使用r2dbc,今天我们看一下怎么使用spring-data-r2dbc这个Spring data对r2dbc的封装来进行r2dbc操作。
程序那些事
2020/12/14
1.4K0
Spring认证中国教育管理中心-Spring Data R2DBC框架教程五
原标题:Spring认证中国教育管理中心-Spring Data R2DBC框架教程五(Spring中国教育管理中心)
IT胶囊
2021/12/07
1.1K0
Spring认证中国教育管理中心-Spring Data R2DBC框架教程五
Spring Data R2DBC响应式操作MySQL
在使用 R2DBC 操作 MySQL 数据库 一文中初步介绍了r2dbc-mysql的使用。但是借助于DatabaseClient操作MySQL,过于初级和底层,不利于开发。今天就利用Spring Data R2DBC来演示Spring 数据存储抽象(Spring Data Repository)风格的R2DBC数据库操作。
码农小胖哥
2020/07/29
2.1K0
Spring Data R2DBC响应式操作MySQL
Spring认证中国教育管理中心-Spring Data R2DBC框架教程三
原标题:Spring认证中国教育管理中心-Spring Data R2DBC框架教程三(Spring中国教育管理中心)
IT胶囊
2021/12/06
2.4K0
Spring认证中国教育管理中心-Spring Data R2DBC框架教程六
原标题:Spring认证中国教育管理中心-Spring Data R2DBC框架教程六(Spring中国教育管理中心)
IT胶囊
2021/12/08
2.2K0
Spring认证中国教育管理中心-Spring Data R2DBC框架教程六
相关推荐
深入理解r2dbc-mysql
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文