根据业务要求,不同的国家设置jvm参数,来确定当前时区。

// -Duser.timezone=Asia/Kolkata 印度加尔各答 GMT+05:30

// -Duser.timezone=Asia/Bangkok 泰国曼谷 GMT+07:00

// -Duser.timezone=Asia/Shangha 中国上海 GMT+08:00

由于各个国家上线项目不完全相同,部分功能在不同的项目有不同实现方式。数据同步时,发生了跨时区同步数据的情况。

例如:

在某个国家部署A服务,在当地时间执行同步任务,可以同步到正确的业务数据,其中业务数据类型使用java.util.Date。

另一个国家部署B服务,同样业务数据类型使用java.util.Date,在当地时间执行同步任务,不可以同步到正确的业务数据,只好改写为java.lang.String类型。

调查原因,发现B服务的jdbc的jar包版本太低,不支持自动时区转换,升级版本为6.0.3,可以正确同步数据。

JdbcTimestampValueFactory

public Timestamp createFromTimestamp(int year, int month, int day, int hours, int minutes, int seconds, int nanos) {

if (year == 0 && month == 0 && day == 0) {

throw new DataReadException(Messages.getString("ResultSet.InvalidZeroDate"));

} else {

synchronized(this.cal) {

this.cal.set(year, month - 1, day, hours, minutes, seconds);

Timestamp ts = new Timestamp(this.cal.getTimeInMillis());

ts.setNanos(nanos);

return ts;

}

}

}

但同时发现A服务不需要指定jdbc.url中的serverTimezone=Asia/Shanghai。

跟踪代码MysqlaSession.configureTimezone(),在不指定serverTimezone时,跟踪获取数据库服务器的时区的代码,获取的确实为CST,但在将转换为对应时区时,A服务将CST转为了Asia/Shanghai,但B服务仍然为CST=Asia/Kolkata。

MysqlaSession

public void configureTimezone() {

String configuredTimeZoneOnServer = this.getServerVariable("time_zone");

if ("SYSTEM".equalsIgnoreCase(configuredTimeZoneOnServer)) {

configuredTimeZoneOnServer = this.getServerVariable("system_time_zone");

}

String canonicalTimezone = (String)this.getPropertySet().getStringReadableProperty("serverTimezone").getValue();

if (configuredTimeZoneOnServer != null && (canonicalTimezone == null || StringUtils.isEmptyOrWhitespaceOnly(canonicalTimezone))) {

try {

canonicalTimezone = TimeUtil.getCanonicalTimezone(configuredTimeZoneOnServer, this.getExceptionInterceptor());

} catch (IllegalArgumentException var4) {

throw (WrongArgumentException)ExceptionFactory.createException(WrongArgumentException.class, var4.getMessage(), this.getExceptionInterceptor());

}

}

if (canonicalTimezone != null && canonicalTimezone.length() > 0) {

this.serverTimezoneTZ = TimeZone.getTimeZone(canonicalTimezone);

if (!canonicalTimezone.equalsIgnoreCase("GMT") && this.serverTimezoneTZ.getID().equals("GMT")) {

throw (WrongArgumentException)ExceptionFactory.createException(WrongArgumentException.class, Messages.getString("Connection.9", new Object[]{canonicalTimezone}), this.getExceptionInterceptor());

}

}

this.defaultTimeZone = this.serverTimezoneTZ;

}

继续跟进转换代码,在com.mysql.cj.jdbc.util.TimeUtil#loadTimeZoneMappings()中,会加载/com/mysql/cj/jdbc/util/TimeZoneMapping.properties文件,在A服务的资源文件中,有个TimeZoneMapping.properties,并且包含CST=Asia/Shanghai。Git代码提交记录备注为CST TimeZone point to Asia/Shanghai。

TimeUtil

private static void loadTimeZoneMappings(ExceptionInterceptor exceptionInterceptor) {

timeZoneMappings = new Properties();

try {

timeZoneMappings.load(TimeUtil.class.getResourceAsStream("/com/mysql/cj/jdbc/util/TimeZoneMapping.properties"));

} catch (IOException var5) {

throw ExceptionFactory.createException(Messages.getString("TimeUtil.LoadTimeZoneMappingError"), exceptionInterceptor);

}

String[] var1 = TimeZone.getAvailableIDs();

int var2 = var1.length;

for(int var3 = 0; var3 < var2; ++var3) {

String tz = var1[var3];

if (!timeZoneMappings.containsKey(tz)) {

timeZoneMappings.put(tz, tz);

}

}

}

``

重要参考链接:

- https://www.cnblogs.com/sogeisetsu/p/12324161.html

- https://blog.csdn.net/weixin_37015554/article/details/105198428

- https://blog.csdn.net/weixin_41917635/article/details/103719481

mysql印度时区_【工作记录】JDBC连接MySQL,跨时区调查CST转Asia/Shangha相关推荐

  1. jdbc连接云数据库mysql数据库_如何通过JDBC连接MySQL数据库

    通过JDBC连接MySQL数据库,代码中的JDBC链接格式如下: jdbc:mysql://:/?sslmode=verify-full&sslrootcert= 表1参数说明参数 说明 如果 ...

  2. mysql ssl jdbc_Mysql启用SSL以及JDBC连接Mysql配置

    文章目录 一.Mysql启用SSL配置 1.检查mysql是否支持ssl 2.设置用户是否使用ssl连接 1.查看用户是否使用SSL连接 2.强制某用户使用SSL连接 3.测试不使用ssl能否连接上 ...

  3. navicat远程连接mysql很慢_解决Navicat远程连接mysql很慢的方法

    ubuntu 下 /etc/mysql/mysql.conf.d [mysqld] skip-name-resolve  增加该字段即可 如果增加该字段,这无法使用本地ip进行登入, 登陆到MySql ...

  4. mysql印度时区_一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...

    CST 时区 名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard Time (USA) UTC-06:00 澳大利亚中部时间 Central Stan ...

  5. 在工作中mysql常用知识_工作中常用的mysql命令

    1.啟動數據庫 #啟動mysql(skip-name-resolve參數是必須的) su - mysql -c "mysqld_safe --skip-name-resolve --open ...

  6. mysql java 问题_【Java】连接MySQL问题总结

    前言 最近在学习Java的数据库相关操作,在看视频时自己找资源而产生的一些问题,在此做个总结. 正文 在刚开始学习的时候,你可能跟着老师这样写代码,虽然某些地方已经冒出了红色的波浪线,但你半信半疑的继 ...

  7. mysql打开eqd_Java 使用JDBC连接MySQL

    //  这学期本来不打算深入学习Java的,课上的小项目也就随便写了一个简单计算器和扫雷游戏就糊弄过去.可是我们的Eliza老师偏偏什么都讲了,考虑到期末也会涉及到JDBC的内容,前些天试着学习一番. ...

  8. mysql分页查询出租房屋信息_分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)...

    分页查询信息 使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目时一个简单的运用eclipse ...

  9. 在java中使用JDBC连接mysql数据库时的服务器时区值无法识别或表示多个时区的问题解决方案

    项目场景: 在java中使用JDBC连接mysql数据库时,报以下的错:Exception in thread "main" java.sql.SQLException: The ...

最新文章

  1. 一文详解手眼标定之九点法
  2. C++中rdbuf()简介及文件流的概念
  3. php ci url,URL路由设置-CI(codeigniter)PHP框架再探
  4. 1.22-科技信息检索主要来源
  5. vue和小程序哪个好学一点_litemall,Spring Boot后端,微信小程序用户前端 + Vue用户移动端...
  6. 激活MyEclipse 6.5方法-通过一段Java程序生成激活码
  7. NSS_08 extjs表单验证
  8. IDEA报错:java: Compilation failed: internal java compiler error
  9. 如何制作Linux程序启动脚本
  10. 免费可开放接口一览表
  11. soui 设置边框_UI神器-SOUI
  12. iOS 实现APP之间内容的拷贝、分享
  13. Java 爬取行政区划代码
  14. 苹果录屏没声音_苹果耳机突然没声音
  15. Selenium面试问题及答案30题版
  16. win10卸载软件_【电脑软件】win10自带浏览器|教你一招,如何完美将它卸载!
  17. 里程碑图、横道图、项目进度网络图比较
  18. 不是每个音乐节都值得狂欢,抖音就不一样
  19. Dx bad class file magic (cafebabe) or version (0033.0000) 导致 NoClassDefFoundError 的问题
  20. python打开本地浏览器_python如何实现打开浏览器

热门文章

  1. 【墨尘】变态心理学(北京大学)
  2. html怎么用img添加图片,img标签(html怎么用img添加图片)
  3. 安装simg2img
  4. AutoJs学习-录制手指动作
  5. 快牙网传——轻松发文字
  6. Symbian OS C++程序员编码诀窍
  7. 微信小程序调用小票打印机实现打印订单
  8. 7z和winrar命令行压缩方法
  9. kubeadm安装的k8s集群证书有效期过期解决方案
  10. 【剑指 Offe】11. 旋转数组的最小数字