최대 절전 모드에서 MySQL이 아닌 다른 표준 시간대를 사용하는 경우 날짜를 뺀 날짜를 저장/검색합니다.
저는 타임존 GMT+3이 있는 MACHINE_A의 Tomcat에서 애플리케이션을 시작했습니다.
저는 MACHINE_B에서 시작된 원격 MySQL 서버를 표준 시간대 UTC와 함께 사용합니다.
지속성을 위해 spring-data-jpa를 사용합니다.
문제의 예로 저장소를 보여드리겠습니다.
public interface MyRepository extends JpaRepository<MyInstance, Long> {
Optional<MyInstance> findByDate(LocalDate localDate);
}
다음 기간 동안 localDate를 통과할 경우2018-09-06
날짜가 있는 엔티티를 가져옵니다.2018-09-05
(전날)
로그에 다음이 표시됩니다.
2018-09-06 18:17:27.783 TRACE 13676 --- [nio-8080-exec-3] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [DATE] - [2018-09-06]
저는 그 질문을 많이 검색했고 같은 내용의 기사를 여러 개 찾았습니다(예: https://moelholm.com/2016/11/09/spring-boot-controlling-timezones-with-hibernate/) ).
그래서, 저는 다음과 같은 것들을 가지고 있습니다.application.yml
:
spring:
datasource:
url: jdbc:mysql://localhost:3306/MYDB?useUnicode=true&characterEncoding=utf8&useSSL=false&useLegacyDatetimeCode=false&serverTimezone=UTC
username: root
password: *****
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
properties:
hibernate:
show_sql: true
use_sql_comments: true
format_sql: true
type: trace
jdbc:
time_zone: UTC
하지만 도움이 되지 않습니다.
다음 커넥터를 사용합니다.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
문제를 해결하려면 어떻게 해야 합니까?
추신.
저는 두 응용 프로그램을 동일한 시간대로 실행하려고 했습니다.이 경우 모든 것이 예상대로 작동합니다.
추신2
MySQL 드라이버 6.0.6 버전을 사용하려고 했지만 변경되지 않습니다.
사용 중인 경우LocalDate
자바에서, 당신은 사용해야 합니다.DATE
열을 표시합니다.이렇게 하면 문제가 해결될 것입니다.
사용하는 경우LocalDateTime
Spring Boot에서 다음과 같은 속성을 설정해 보십시오.
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
작동 상태를 확인하려면 고성능 Java Persistence GitHub 저장소에서 이 설정이 MySQL에서 작동하는 방법을 보여주는 테스트 사례를 찾을 수 있습니다.
몇 가지 통합 테스트를 생성하는 동안 비슷한 문제에 직면했습니다.spring-boot
응용 프로그램 사용hibernate
여기서 사용한 데이터베이스는postgreSQL
.
다른 답변이 올바르게 지적했듯이, 다음을 설정할 수 있습니다.hibernate.jdbc.time_zone=UTC
배당금과 같은 재산이것이 제 문제를 해결하지 못해서 신경쓰지 마세요. 그래서 저는 다음을 설정해야 했습니다.JVM
기본 표준 시간대와 내 시간대에 있는 다음의 도움이 있습니다.spring-boot
응용 프로그램 기본 클래스:
@PostConstruct
public void init(){
TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // It will set UTC timezone
System.out.println("Spring boot application running in UTC timezone :"+new Date()); // It will print UTC timezone
}
이것은 또한 당신의 문제를 해결할 것입니다.여기에서 더 많은 정보를 수집할 수 있습니다.
이유
문제(검색 날짜 - 1일)는 특정 설정에서 발생한 것 같습니다.응용 프로그램이 UTC에서 실행되고 있고 GMT+3의 데이터베이스에서 타임스탬프를 요청하는 경우 응용 프로그램 컨텍스트가 다음과 같은 이유로 더 이른 날짜에 해결됩니다.JVM
그리고.Hibernate
책임 있음)는 UTC에서 데이터베이스 컨텍스트보다 3시간 늦습니다.간단한 예:
2018-12-02 00:00:00
3시간 =2018-12-01 21:00:00
날짜만 보고 있으므로 다음과 같이 하십시오.2018-12-02
3시간 =2018-12-01
버전 8.0.22 이전 버전의 MySQL Connector에 버그가 있습니다. 로컬 날짜에 대한 스프링 데이터 쿼리에서 잘못된 항목을 반환합니다. - 1일
두 서버 모두 동일한 표준 시간대에 있어야 하며 UTC 표준 시간대에 있는 것을 선호해야 합니다.사용자에게 올바른 시간대를 보여주기 위해 브라우저 자체에서 시간을 구문 분석합니다.그리고 DB에서 데이터를 검색하는 동안 UTC 시간을 사용합니다.이렇게 하면 DB에서 데이터를 가져오는 동안 문제가 발생하지 않습니다.
MySQL에서...
TIMESTAMP
UTC를 내부적으로 저장하지만 두 가지 설정을 기준으로 서버의 표준 시간대로 변환합니다.은 다음통설확에서 하십시오.SHOW VARIABLES LIKE '%zone%';
올바르게 구성되면 판독기가 작성기(tz 설정 기준)와 다른 시간을 볼 수 있습니다.
DATE
그리고.DATETIME
주는 대로 가져가세요.클라이언트의 문자열과 테이블에 저장된 문자열 사이에 tz 변환이 없습니다.시계 그림을 저장하는 것이라고 생각해보세요.독자는 작성자가 작성한 것과 동일한 시간 문자열을 볼 수 있습니다.
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
TimeZone Date를 작업할 때 사용되지만 로그를 보면 TimeZone을 통과하지 않는 것 같습니다.
바인딩 매개 변수 [1]을 [DATE]로 - [2018-09-06]
원격 속성 시도:
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
다음 구문 분석을 HQL 쿼리에 추가하면 시간대 형식이나 시간대가 없는 날짜가 반환됩니다.이것은 문제에 대한 빠른 해결 방법입니다.
select DATE_FORMAT(date,'%Y-%m-%d') from Entity
전에 답에 지시된 대로 다 해봤어요, 예를 들면
- spring.jpa. 속성을 추가하는 중입니다.hibernate.jdbc.time_zone=America/Sao_Paulo
- 시간대 설정: 기본설정대간시:
TimeZone.setDefault(TimeZone.getTimeZone("America/Sao_Paulo"))
그러나 매개 변수 serverTimezone=America/Sao_Paulo를 JDBC URL에 추가하기 전까지는 작동하지 않았습니다.
jdbc:mysql://localhost:3306/aurorabuzz-test?serverTimezone=America/Sao_Paulo
이제는 아주 잘 작동합니다!
언급URL : https://stackoverflow.com/questions/52207233/hibernate-saves-retrieves-date-minus-day-if-application-uses-another-timezone-th
'sourcecode' 카테고리의 다른 글
연결을 허용하기 위해 봄 부팅에서 Tcp 연결을 만드는 방법은 무엇입니까? (0) | 2023.07.07 |
---|---|
SQL Server Management Studio에서 마우스 오른쪽 버튼으로 스크립트 변경 테이블 사용 안 함 (0) | 2023.07.07 |
제공자 설치 관리자 모듈을 로드하지 못했습니다.허용 가능한 모듈을 찾을 수 없습니다.로컬 버전은 0이고 원격 버전은 0 오류 변동입니다. (0) | 2023.07.07 |
비트 배열에 설정된 최상위 비트(맨 왼쪽) 찾기 (0) | 2023.07.07 |
GitHub 풀 요청을 Git로 확인하려면 어떻게 해야 합니까? (0) | 2023.07.07 |