PGSQL在jdbc和navicat执行select now()不一致的问题分析

114 阅读1分钟

一 问题描述

数据库:PGSQL

数据库时间为UTC,线上有一台Linux服务器是UTC+8,但是执行select now()时返回了UTC+8的时间

二 问题复现

使用navicat 查询

image.png

使用JDBC 查询

image.png

三 思路分析

两条一样的sql得出了不同的结果,所以我的猜测是 jdbc连接时额外维护了时区的信息

在连接处打上断点观察pgConnection,果然是为我们设置了默认值 image.png

四 寻找答案

从queryExecutor对象一直往上找,找到TimeZone对象最终赋值的地方

image.png

pgsql把TimeZone参数是从pgStream流对象中获取的,大部分的连接配置也封装在这个对象中。

想要继续寻找value的来源,可以debug一下ConnectionFactoryImpl类的tryConnect方法 创建连接时pg初始化了一些参数如下

image.png

最终通过 TimeZone.getDefault().getID() 获取了jvm的时区,由于jvm并未设置,也就获取了系统的时区

image.png