codememo

스프링 부트 구성에서 올바른 MySQL JDBC 시간대를 설정하는 방법

tipmemo 2023. 3. 4. 14:59
반응형

스프링 부트 구성에서 올바른 MySQL JDBC 시간대를 설정하는 방법

DB:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.27, for osx10.10 (x86_64) using  EditLine wrapper

스프링 부트: 2.1.1풀어주다

오류:

2019-01-01 15:56:25.849 ERROR 39957 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
> :bootRun
java.sql.SQLException: The server time zone value 'AEDT' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

속성 파일의 관련 부분:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&serverTimezone=UTC
spring.datasource.username=#####
spring.datasource.password=########
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

, 하고 있는 로 을 알 수 만, AEDT 로 를 했습니다.spring.datasource.url히카리는 초기화할 때 다른 것을 읽습니까?

Hikari는 데이터베이스 url의 서버 시간대 설정을 무시하고 AEDT(호주 Melbourne)라는 제 머신의 시간대 설정을 사용하는 것처럼 보입니다.이것은 바람직하지 않은 행동입니다.히카리는 내 기계의 타임존을 무시해 주었으면 좋겠어.어떻게 그렇게 만드는지 아는 사람 있어?

★★useLegacyDatetimeCode 및 Timezonefalse 를 설정합니다.

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

답변 감사합니다만, 해결 방법을 찾았습니다.

예상대로 Hikari는 데이터 소스 URL에 무엇을 넣든 무시합니다(죄송합니다만, 무엇을 넣든 상관없습니다). 기본적으로 MySQL 자체에서 시간대 설정을 읽습니다. 즉, 명령어를 발행할 때 표시되는 결과가 무엇이든 상관없습니다.

SELECT @@GLOBAL.time_zone;

MySQL에 있습니다.제 경우, 결과는 "SYSTEM"으로, 로컬 머신의 설정이 무엇이든 상관없습니다.이것은 MySQL 드라이버에서는 지원되지 않는 AEDT이므로 예외입니다.

AWS에서 동일한 쿼리를 실행하면 지원되는 값 "UTC"가 생성됩니다(그리고 실제로 원하는 값).

따라서 로컬 MySQL 서버에서 시간대를 설정해야 했습니다.

먼저 사용 가능한 타임존을 호스트(Mac OS X)에서 MySQL로 로드해야 했습니다.zoneinfo 파일)의./usr/share/zoneinfoMySQL를 머신이mysql_tzinfo_to_sql'을 하기 위해 합니다.Mac OS X X 음음음 음음음 mac mac 。

/usr/local/mysql/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

그런 다음 MySQL에서 다음 명령을 실행할 수 있습니다.

SET GLOBAL time_zone = UTC;

는 유효한 표준 시간대이며 클라우드 기반 인스턴스와 동기화됩니다.

MySQL with Spring Boot을 사용하는 많은 사람들에게 이것은 진정한 함정이라고 생각합니다.서포트되고 있는 타임존에서는 동작합니다만, 만약 개발 머신이 서포트되고 있지 않은 타임존으로 바뀌면, 이상하게도 망가져 버립니다.어디에도 문서화되어 있지 않은 것에 놀랐습니다.MySQL Connector/J의 소스 코드를 보면 알 수 있지만 그렇지 않으면 알 수 없습니다.

MySQL은 5년 전이고, 나는 오래된 화석이고, 음, 내 잔디밭에서 그냥 나가버려!

이건 나한테 효과가 있었어.db URL의 변수를 다음과 같이 설정합니다.application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=America/Los_Angeles

아래 dburl에 다음 변수를 추가했습니다.application.properties:

spring.datasource.url=jdbc:mysql://localhost:3306/db_name?serverTimezone=GMT-6

Spring Boot이 정상적으로 동작하게 되었습니다.

MySQL 8을 사용하고 있는데 user.timezone 속성의 값을 삽입하여 이 문제를 해결했습니다.

내 프로젝트에서 자바8을 사용한다.

application.properties 관련 설정:

spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.datasource.url=jdbc:mysql://localhost:3306/mudi?serverTimezone=${user.timezone}

2.3.4를 사용.상위 프로젝트로 릴리즈합니다.

사용되는 의존관계:

  • 스프링 부츠 삼엽
  • 스프링 부츠 웹
  • 스프링 부트 개발 도구
  • 스프링 부트 테스트
  • 준니트 엔진
  • spring-boot-data-jpa
  • mysql-sysql 매개체

HTH,

WB::

Shaun에 이어 spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost:3306/DEMOS?serverTimezone=DEMS로 충분했습니다.

set useLegacyDatetimeCode false가 기능하고 있습니다.감사합니다.

spring.datasource.url: jdbc:mysql://localhost:3306/employee_directory? 
useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

jdk 14를 사용해서 이렇게 해야 했어요.application.properties

spring.jpa.properties.hibername.jdbc.time_zone=US/Michigan

편집: 포맷

같은 문제에 부딪혔지만

?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

당신의 스키마 이름으로 이 문제를 해결한 후에요.이렇게 생겼어야 하는데

spring.datasource.url = jdbc:mysql://localhost:3306/my-schema-name?useSSL=false&serverTimezone=UTC&useLegacyDatetimeCode=false

저는 현재 MySQL v8을 사용하고 있는데, 이것은 저에게 잘 맞습니다.

또 다른 방법은 파일에 파일을 넣는 것입니다.application.properties다음 행:

spring.jpa.properties.hibernate.jdbc.time_zone=UTC

https://www.baeldung.com/mysql-jdbc-timezone-spring-boot 에서 옵션으로 제공됩니다.

더하다useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false연결 문자열:

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/avmaint-local?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

세 가지 방법을 시도했습니다.

  1. TimeZone.setDefault(TimeZone.getTimeZone('아시아/콜롬보'));//이니셜라이저
  2. spring.jpa.properties.hibernate.jdbc.time_zone=아시아/Colombo // applications.properties에서
  3. < spring - boot . run . jvm Arguments > - Duser . timezone = Asia / Colombo < / spring - boot . run . jvm Arguments > // POM 파일 속성 설정

JDBC URL에서 속성을 설정해 보았습니다.

  • useLegacyDatetimeCode=false
  • server Timezone=아시아/콜롬보

위의 것 중 어느 것도 나에게 통하지 않았다.가장 가능성이 희박한 용의자 잭슨이 내 타임존을 무시하고 있다는 걸 알아챘어

spring.jackson.time-zone=Asia/Colombo (The Answer)

이것을 application.properties에 포함시킵니다(그것만으로도 충분합니다).

스프링 기동 시 테스트 완료(2.1.5).릴리즈, MYSQL8.

언급URL : https://stackoverflow.com/questions/53993181/how-to-set-correct-mysql-jdbc-timezone-in-spring-boot-configuration

반응형