对于90后出生的孩子来说,夏令时还是比较陌生的,如果咨询上一辈的人就会有些印象。当我在家里的微信群发出这个疑问时,家里的姨姨舅舅无不吐槽,甚至说是一种自欺欺人的行为(O(∩_∩)O哈哈~)。那么,什么是夏令时呢?

简单说就是夏天为了珍惜白天的时间,在指定日子把时钟拨快一小时,这样人们就可以早起工作节约用电。举个例子,假如平时是8点上班,夏令时的时候将时钟调快一小时,这样夏令时的8点钟,实际就成了7点去上班。主要是为了晚上可以早一个小时休息,节约用电。

然而,我们大中华地域辽阔,虽然规定了统一使用东八时区,但是在一些偏远地方,比如新疆、西藏等,实际日出日落时间就不是东八的标准。这样导致我们的夏令时只是一部分地区可以起到目标效果,其他地方反而更不方便。于是在 1986 ~ 1991 年短暂执行了六年后,终于在1992年取消了该政策,至此也为后来的程序行业埋下了小小的雷。

公司进行系统升级,由原本的Oracle 11g 升级为 Oracle 12c ,所以其对应的JDK、Ojdbc都需要进行相应的调整。一切都很顺理成章,应用测试也很顺利,除了一些业务逻辑的bug,并未发现技术类的bug。

直到有一天,测试的同事在前台页面发现了异常,展示信息的表单控件中,一个日期格式的文本框竟然夹带了时间,查找数据库中对应的数据感觉非常无厘头,甚至看着有一点好玩。期初根本想不到是夏令时引起的数据异常,都还在傻乎乎的看日志,找对应的DML语句,最后还是我们的架构师一语道破。接下来就是漫长纠错与解决历程了。

以下是我们测试代码,以及数据库生成的数据:

package com.aikes.tools.utility;import java.sql.*;
import java.text.SimpleDateFormat;public class TestDate
{public static void main(String[] args){String tUrl = "jdbc:oracle:thin:Aikes/Aikes@127.0.0.1:1521:aikes";PreparedStatement pstmt = null;Connection con = null;try{con = DriverManager.getConnection(tUrl);pstmt = con.prepareStatement("insert into testdate (makedate) values (?)", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");java.util.Date utilDate = df.parse("1986-05-04");pstmt.setDate(1, new Date(utilDate.getTime()));pstmt.executeUpdate();pstmt.close();con.close();}catch (Exception e){System.out.println(e.getMessage());}finally {try{pstmt.close();con.close();}catch (SQLException ex){}}}
}

废话不多说,直接看原因以及我们制定的解决方案。

首先,出现这种情况的根本是在preparestatement绑定变量插入日期时,遇到夏时令首日底层会进行加一小时的操作,比如:1986-05-04、1987-04-12等等,共计六个日期。引起该问题的初步归结到三个模块,操作系统,JDK,ojdbc。接下来就是问题复现的环境。

通过控制变量进行迭代测试,我本地已经可以复现该问题(坎坷的不敢回忆~),最终初步确定该问题与JDK无关,当且仅当win7环境下ojdbc驱动版本大于等于7才会出现该问题。win 8、win10 无论驱动版本如何都没有问题;ojdbc 6 及以下版本无论何种操作系统都没问题。

由于数据库版本是 Oracle 12c ,所以使用 ojdbc 7是必然的,至此,我们可以考虑是服务器的linux系统版本存在异常,需要进行升级维护。但是为了规避升级带来的其他风险,并且通过评估,出问题的日期相对比重很小(只有夏令时首日会出现加一小时的情况),暂时不需要大规模升级,只能想一个折中的办法进行处理。要么落库前修正,要么落库后运维,后期维护成本高且业务场景多变,这样一来第一想到的就是通过oracle 的 trigger 进行数据修正,并且只能使用 before DML 的方式在最终DML操作前对有误的日期变量做处理(Do you know why ? HAHA )。

至此,问题基本解决。IT 就是这样,解决之后的总结总是云淡风轻,可是问题出现的时候玩命找原因简直是煎熬,尤其是在控制变量做迭代测试的时候,反反复复追代码看问题,JDK底层看的都脑阔疼,不过结局是好的,将这段经历分享给大家,希望可以帮到你们。

夏令时引起的数据库存储异常相关推荐

  1. Pliops XDP(Extreme Data Processor)数据库存储设计的新型加速硬件

    文章目录 0 前言 1 核心问题 1.1 引擎的各方面性能受限于数据结构的选择 1.2 压缩功能 导致的CPU瓶颈 1.3 Crash-safe 崩溃异常的无奈选择 1.4 当前主流 加速硬件 较难满 ...

  2. 使用嵌入式关系型SQLite数据库存储数据

    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...

  3. 二月技术通讯.pdf丨核心数据库一波三折异常重启分析

    每月关注:55 页 干货,汇总一个月数据库行业热点事件.新的产品特性,包括重要数据库产品发布.警报.更新.新版本.补丁等. 亲爱的读者朋友: 为了及时共享行业案例,通知共性问题,达成共享和提前预防,以 ...

  4. Android SQLite 数据库存储

    SQLite说明 SQLite是一款轻型的关系型数据库服务器,移动设备的数据库存储都是用SQLite 应用运行需要保存一系列有一定结构的数据,比如:公司员工信息 存储的文件类型:.db 数据保存的路径 ...

  5. Flask项目实战——7—(Redis数据库存储验证码信息、验证登录界面的表单信息、注册功能实现、登录实现)

    推荐一个API平台:聚合数据 1.Redis数据库存储验证码信息 保存手机验证码到Redis数据库 公有视图文件:apps/common/views.py # -*- encoding: utf-8 ...

  6. Spring Security 6.x 系列【2】认证篇之使用数据库存储用户

    有道无术,术尚可求,有术无道,止于术. 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl ...

  7. 数据库存储引擎—InnoDB,MyISAM,Memory

    数据库存储引擎-InnoDB,MyISAM 存储引擎 首先,什么是存储引擎: Mysql用各种不同的存储技术,将数据存储到文件或内存中.数据库存储引擎是数据库的底层的软件组件,数据库可以使用数据存储引 ...

  8. mysql int 默认值 为ull_mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题...

    今天的目标: mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题 先讲约束: 要他唯一 不能重复 不能空值 : 什么是 mysql的约束: 对mysql 进行约束 2.2  默 ...

  9. MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;

    一. MySQL 中的执行计划 1 MySQL 执行计划 在 MySQL 中可以通过 explain 关键字模拟优化器,执行 SQL 语句,从而知道 MySQL 是 如何处理 SQL 语句的. 2 M ...

最新文章

  1. leetcode算法题--设计链表
  2. 【转】Kettle集群
  3. python dict常用操作
  4. Entity Framework Code First模式基础知识及入门实例01
  5. 计算机视觉导论试题,计算机视觉基础复习.docx
  6. mysql 报错1005_MysqlERROR 1005错误处理
  7. 极光推送 java 绑定别名_极光推送-别名篇
  8. 关于Cocos2d-x中实例伸缩后的位置设置
  9. Android Studio 报 非法字符: ‘\ufeff‘解决
  10. WML语言基础(WAP建站)六
  11. 家庭版完全免费,下面的注册码为:avast! 4 pro(专业版)的
  12. Python网络爬虫经典书籍推荐
  13. 前端基础学习之css3-(border-image)实现边框图片自适应填充
  14. python fun函数、求4x4整型数组的主对角线元素的和_C语言编程求一个4x4数组左下三角 包括主对角线元素的和...
  15. 按某一列统计重复数据,并获取对应行数据
  16. 上百本中文书籍中对《人月神话》的引用(1)
  17. Monitoring(监控)
  18. 【整理】EFI/UEFI BIOS 入门 : All For Beginners
  19. 宝塔面板+NextCloud文档云 搭建流程
  20. mesh 协调器 路由器_双模网络协调器、双模路由器和双模mesh组网系统的制作方法...

热门文章

  1. OrmLite使用笔记
  2. team5第三次作业-改进目标
  3. 关于一个小和尚的故事
  4. cam_power:
  5. DBeaver连接phoenix
  6. 電腦教室的管理與規劃
  7. 利用EXCEL设计JJ斗地主的比赛模式
  8. Gstreamer 内存管理
  9. 使用DB查询分析器实现异构数据源中数据表的相互访问
  10. 1.1. Cryptographic Hash Function.加密哈希函数