java 服务器时间 jvm_jvm时间和系统时间不一致问题

前提引入:

在项目开发过程中发现一个更新其他字段的sql 竟然在数据库中把updateTime字段修改了,而且修改的时间与当前系统北京时间相差了接近八个小时。

mybatis 中update更新语句为

update xxxx set xxxx = #{xxxx}

where xxxxid = #{xxxxxId}

复制代码

通过排查发现在数据库中 对于update_time字段 定义如下

`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

复制代码

同时只有使用upate 语句进行更新的时候(有值改变)才会对update_time进行更新

使得在进行更新的时候数据库时间自动更新,以前未发现这个bug原因是对于update更新语句传入的参数都是使用了java Date类生成时间,进行重新赋值,所以没有这个问题。

因为刚好相差 八个小时 ,估计是时区的问题所以进行排查。发现linux系统时间确实跟更新数据库时间一样。

使用的Date —R 指令查看指令时间 当前北京时间为19:58 linux服务器时间为11:58

找到问题之后产生疑问为什么使用java类重新生成的时间确实是北京时间,难道这边跟系统时间不一样吗?

方式1:

jinfo 1728 |grep user.timezone

复制代码

查看jvm 运行pid 设置时间

方式2:

查看JVM虚拟机参数 通过jps 或者ps -ef |grep java 指令查看 当前运行的java项目

获取到pid之后使用jinfo (可以实时查看和调整jvm配置参数)

ee5018448b6fab45a50bcc97e3c2436e.png

可以看到服务器这边jvm设置的时间为上海时间。

方式3:

通过jvisualvm即可得到、

解决方法

在程序中使用java的函数设定时区。

在启动java程序时加参数-Duser.timezone=GMT+8

修改etc/sysconfig/clock 文件 因为jre是从/etc/sysconfig/clock这个文件中 获取时区信息的

附clock文件内容:

ZONE="Asia/Shanghai"

UTC=false

ARC=false

ZONE -- 时区

UTC -- 表明时钟设置为UTC。

ARC -- 仅用于alpha表明使用ARC。

复制代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值