Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MyBatis的时区问题&x2B;MyBatis CDI+;PostgreSQL_Java_Postgresql_Mybatis_Ibatis_Mybatis Cdi - Fatal编程技术网

Java MyBatis的时区问题&x2B;MyBatis CDI+;PostgreSQL

Java MyBatis的时区问题&x2B;MyBatis CDI+;PostgreSQL,java,postgresql,mybatis,ibatis,mybatis-cdi,Java,Postgresql,Mybatis,Ibatis,Mybatis Cdi,我在MyBatis有一个奇怪的时区问题 环境: mybatis v3.4.5 mybatis cdi v1.0.1 Payara应用服务器v4.1.2.173 PostgreSQL数据库 JNDI数据源,托管事务设置 首先我将在有日期时间字段的表中插入一条记录。 在Java方面,它是一个Java.time.ZonedDateTime。在数据库中,我对该字段使用带时区的时间戳 这是一段相关的代码: request.setRequestDate = ZonedDateTime.now(); LO

我在MyBatis有一个奇怪的时区问题

环境:

  • mybatis v3.4.5
  • mybatis cdi v1.0.1
  • Payara应用服务器v4.1.2.173
  • PostgreSQL数据库
  • JNDI数据源,托管事务设置
首先我将在有日期时间字段的表中插入一条记录。 在Java方面,它是一个
Java.time.ZonedDateTime
。在数据库中,我对该字段使用带时区的时间戳

这是一段相关的代码:

request.setRequestDate = ZonedDateTime.now();
LOGGER.info("xxx-xxx-xxx: " + httpRequest.getRequestDate());
myMapper.save(request);
在日志文件中,我可以看到:

[INFO ] 2017-10-18 18:43:45,501 com..................... - xxx-xxx-xxx: 2017-10-18T18:43:45.493+02:00[Europe/Prague]
[DEBUG] 2017-10-18 18:43:45,608 com...xxxDao.saveRequest - ==>  Preparing: INSERT INTO table_a (id, ..., request_date) VALUES (?, ?, ...) 
[DEBUG] 2017-10-18 18:43:45,770 com...xxxDao.saveRequest - ==> Parameters: 281(Long), ..., 2017-10-18 16:43:45.493(Timestamp)
[DEBUG] 2017-10-18 18:43:45,783 com...xxxDao.saveRequest - <==    Updates: 1
这没关系,因为我在数据库中使用GMT时区

然后我在同一数据源上使用不同的映射器类执行另一个sql插入(POJO也不同),但Java和sql类型是相同的。问题是日期时间值与
GMT+2
时区一起插入数据库,而不是
GMT

[INFO ] 2017-10-18 18:43:46,188 com..................... - yyy-yyy-yyy: 2017-10-18T18:43:46.188+02:00[Europe/Prague]
[DEBUG] 2017-10-18 18:43:46,190 com...yyyDao.saveMetadata - ==>  Preparing: INSERT INTO table_b (id,..., uploaded) VALUES (?, ?, ...) 
[DEBUG] 2017-10-18 18:43:46,202 com...yyyDao.saveMetadata - ==> Parameters: 561(Long), ..., 2017-10-18 18:43:46.188(Timestamp)
[DEBUG] 2017-10-18 18:43:46,212 com...yyyDao.saveMetadata - <==    Updates: 1
我的第一个猜测是它来自错误的数据库池设置,因此我在池配置中添加了以下属性:

sessionTimeZone=UTC
但我仍然在UTC中插入第一个日期时间,在UTC+2时区中插入第二个日期时间

我曾尝试注销java.sql.Connection的详细信息,以了解这里到底发生了什么,因此我将SQLSqSession注入了我的代码(@InjectSQLSession SqlSession),但当然我得到了一个
org.apache.ibatis.session.SqlSessionException:错误:无法获得连接。未启动托管会话。
异常,因为我使用托管事务处理

知道要检查什么吗

----更新1---

因此,我根据建议将所有内容更改为UTC:

  • postgresql.conf:timezone='UTC'
  • 应用服务器:-Duser.timezone=UTC
看起来不错,但是

在PostgreSQL控制台中执行查询时,结果如下:

select request_date from table_a
result: 2017-10-18 16:43:45.493
demo=# select EXTRACT(TIMEZONE FROM uploaded), uploaded from image_metadata;
 date_part |          uploaded
-----------+----------------------------
         0 | 2017-10-25 00:24:11.873+00
(1 row)
SqurielSQL中的查询结果相同:

date_part   uploaded
0           2017-10-25 02:24:11.873
我的SQL客户端似乎在后台进行了一些棘手的时区对话,但我不确定。我需要检查一下

----更新2---

我不确定问题出在哪里,但在将数据库和JVM时区设置更改为UTC后,我的问题得到了解决

我使用以下SQL查询从数据库中获取存储的日期时间值:

SELECT current_timestamp AT TIME ZONE 'UTC'

我会将一切设置为UTC,使一切变得更简单

LOGGER.info(TimeZone.getDefault().getID())
如果显示的不是UTC,则将VM参数
-Duser.timezone=UTC
添加到应用程序启动中

代码段变量
request
/
httpRequest
中存在混乱,可能只是输入错误

请求.setRequestDate=ZoneDateTime.now()

LOGGER.info(“xxx xxx xxx:+httpRequest.getRequestDate())


我会将一切设置为UTC,使一切变得更简单

LOGGER.info(TimeZone.getDefault().getID())
如果显示的不是UTC,则将VM参数
-Duser.timezone=UTC
添加到应用程序启动中

代码段变量
request
/
httpRequest
中存在混乱,可能只是输入错误

请求.setRequestDate=ZoneDateTime.now()

LOGGER.info(“xxx xxx xxx:+httpRequest.getRequestDate())


那只是个打字错误,很抱歉。我的SQL客户端似乎做了一些意想不到的事情。请查看帖子中的更新信息。这只是一个输入错误,对此表示抱歉。我的SQL客户端似乎做了一些意想不到的事情。请检查post.yep中的更新信息,默认情况下,每个客户端(包括java)都将使用本地系统时区,除非在连接url中明确指定另一个值作为选项(取决于db供应商)或通过命令(如[set session timezone]()yep,每个客户端(包括java)默认情况下将使用本地系统时区,除非在连接url(取决于db供应商)中明确指定另一个值作为选项,或通过命令(如[set session timezone]()