sourcecode

최대 절전 모드에서 MySQL이 아닌 다른 표준 시간대를 사용하는 경우 날짜를 뺀 날짜를 저장/검색합니다.

codebag 2023. 7. 7. 19:00
반응형

최대 절전 모드에서 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열을 표시합니다.이렇게 하면 문제가 해결될 것입니다.

사용하는 경우LocalDateTimeSpring 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:003시간 =2018-12-01 21:00:00

날짜만 보고 있으므로 다음과 같이 하십시오.2018-12-023시간 =2018-12-01

버전 8.0.22 이전 버전의 MySQL Connector에 버그가 있습니다. 로컬 날짜에 대한 스프링 데이터 쿼리에서 잘못된 항목을 반환합니다. - 1일

두 서버 모두 동일한 표준 시간대에 있어야 하며 UTC 표준 시간대에 있는 것을 선호해야 합니다.사용자에게 올바른 시간대를 보여주기 위해 브라우저 자체에서 시간을 구문 분석합니다.그리고 DB에서 데이터를 검색하는 동안 UTC 시간을 사용합니다.이렇게 하면 DB에서 데이터를 가져오는 동안 문제가 발생하지 않습니다.

MySQL에서...

TIMESTAMPUTC를 내부적으로 저장하지만 두 가지 설정을 기준으로 서버의 표준 시간대로 변환합니다.은 다음통설확에서 하십시오.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

반응형