mysql印度时区_【工作记录】JDBC连接MySQL,跨时区调查CST转Asia/Shangha
根据业务要求,不同的国家设置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相关推荐
- jdbc连接云数据库mysql数据库_如何通过JDBC连接MySQL数据库
通过JDBC连接MySQL数据库,代码中的JDBC链接格式如下: jdbc:mysql://:/?sslmode=verify-full&sslrootcert= 表1参数说明参数 说明 如果 ...
- mysql ssl jdbc_Mysql启用SSL以及JDBC连接Mysql配置
文章目录 一.Mysql启用SSL配置 1.检查mysql是否支持ssl 2.设置用户是否使用ssl连接 1.查看用户是否使用SSL连接 2.强制某用户使用SSL连接 3.测试不使用ssl能否连接上 ...
- navicat远程连接mysql很慢_解决Navicat远程连接mysql很慢的方法
ubuntu 下 /etc/mysql/mysql.conf.d [mysqld] skip-name-resolve 增加该字段即可 如果增加该字段,这无法使用本地ip进行登入, 登陆到MySql ...
- mysql印度时区_一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...
CST 时区 名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard Time (USA) UTC-06:00 澳大利亚中部时间 Central Stan ...
- 在工作中mysql常用知识_工作中常用的mysql命令
1.啟動數據庫 #啟動mysql(skip-name-resolve參數是必須的) su - mysql -c "mysqld_safe --skip-name-resolve --open ...
- mysql java 问题_【Java】连接MySQL问题总结
前言 最近在学习Java的数据库相关操作,在看视频时自己找资源而产生的一些问题,在此做个总结. 正文 在刚开始学习的时候,你可能跟着老师这样写代码,虽然某些地方已经冒出了红色的波浪线,但你半信半疑的继 ...
- mysql打开eqd_Java 使用JDBC连接MySQL
// 这学期本来不打算深入学习Java的,课上的小项目也就随便写了一个简单计算器和扫雷游戏就糊弄过去.可是我们的Eliza老师偏偏什么都讲了,考虑到期末也会涉及到JDBC的内容,前些天试着学习一番. ...
- mysql分页查询出租房屋信息_分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)...
分页查询信息 使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目时一个简单的运用eclipse ...
- 在java中使用JDBC连接mysql数据库时的服务器时区值无法识别或表示多个时区的问题解决方案
项目场景: 在java中使用JDBC连接mysql数据库时,报以下的错:Exception in thread "main" java.sql.SQLException: The ...
最新文章
- 一文详解手眼标定之九点法
- C++中rdbuf()简介及文件流的概念
- php ci url,URL路由设置-CI(codeigniter)PHP框架再探
- 1.22-科技信息检索主要来源
- vue和小程序哪个好学一点_litemall,Spring Boot后端,微信小程序用户前端 + Vue用户移动端...
- 激活MyEclipse 6.5方法-通过一段Java程序生成激活码
- NSS_08 extjs表单验证
- IDEA报错:java: Compilation failed: internal java compiler error
- 如何制作Linux程序启动脚本
- 免费可开放接口一览表
- soui 设置边框_UI神器-SOUI
- iOS 实现APP之间内容的拷贝、分享
- Java 爬取行政区划代码
- 苹果录屏没声音_苹果耳机突然没声音
- Selenium面试问题及答案30题版
- win10卸载软件_【电脑软件】win10自带浏览器|教你一招,如何完美将它卸载!
- 里程碑图、横道图、项目进度网络图比较
- 不是每个音乐节都值得狂欢,抖音就不一样
- Dx bad class file magic (cafebabe) or version (0033.0000) 导致 NoClassDefFoundError 的问题
- python打开本地浏览器_python如何实现打开浏览器