MySQL JDBC 드라이버 5.1.33 - 타임존 문제
일부 배경:
Tomcat 7에서 Java 1.6 웹 앱을 실행하고 있습니다.데이터베이스는 MySQL 5.5입니다.이전에는 DB에 접속하기 위해 Mysql JDBC 드라이버 5.1.23을 사용하고 있었습니다.모든 것이 잘 되었다.최근에 Mysql JDBC 드라이버 5.1.33으로 업그레이드했습니다.업그레이드 후 Tomcat은 앱을 시작할 때 이 오류를 발생시킵니다.
WARNING: Unexpected exception resolving reference
java.sql.SQLException: The server timezone value 'UTC' is unrecognized or represents
more than one timezone. You must configure either the server or JDBC driver (via
the serverTimezone configuration property) to use a more specifc timezone value if
you want to utilize timezone support.
왜 이런 일이 생기는 건가요?
5.1.를 UTC JDBC 를 UTC 5.1.33serverTimezone
이치노
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
MySQL을 설정하여 이 문제를 해결했습니다.
SET GLOBAL time_zone = '+3:00';
이 토픽에 관한 몇 개의 투고를 읽고, 다양한 설정을 테스트하고, 이 mysql 버그 스레드의 몇 가지 통찰력을 바탕으로 이해했습니다.
- 서버 표준 시간대는 데이터베이스에 저장된 날짜를 애플리케이션 서버의 표준 시간대로 변환하는 데 특히 중요합니다.다른 의미도 있지만 이것이 가장 눈에 띄는 것이다.
- GMT x UTC 시간대 시스템.GMT는 19세기 후반에 고안되었으며 표준시와 여름 시간 사이에 전환될 수 있습니다.이 속성으로 인해 데이터베이스 서버가 여름 시간으로 전환되고 애플리케이션이 이를 인식하지 못하는 상황이 발생할 수 있습니다(다른 문제가 있을 수 있지만 더 이상 조사하지는 않았습니다).UTC는 시간에 따라 변화하지 않는다(경도 0°에서 항상 평균 태양 시간과 약 1초 이내).
- serverTimeZone의 mysql jdbc의 5.1의 경우 까지는 8의 경우 될 수 .
useLegacyDatetimeCode=true
은 「」와 조합되어useJDBCCompliantTimezoneShift=true
는, 애플리케이션이 접속 마다 데이타베이스 타임 존을 취득하도록 합니다.이 모드에서는 'British Summer Time'과 같은 GMT 시간대가 내부 Java/JDBC 형식으로 변환됩니다.이러한 .properties 파일에서 새 시간대를 정의할 수 있습니다. - 매칭jdbc " " " 8 " " )
useJDBCCompliantTimezoneShift
형식useLegacyDatetimeCode
가 삭제되었습니다(mysql jdbc connector changelog 참조).따라서 이들 2개의 파라미터는 완전히 무시되기 때문에 설정에는 영향이 없습니다(새로운 기본값은useLegacyDateTimeCode=false
) - 으로, 「」를 설정합니다.
serverTimezone
시간대(어플리케이션/데이터베이스 서버)가 'UTC+xx' 또는 'GMT+xx' 형식이 아닌 경우 필수입니다. - UTC 로를 들어 UTC 의 경우).
jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
응용 프로그램/데이터베이스 서버가 이 시간대에 없는 경우에도 마찬가지입니다.중요한 것은 애플리케이션 연결 문자열 + 데이터베이스를 동일한 시간대와 동기화하는 것입니다.즉, server Timezone=을 설정하기만 하면 됩니다.데이터베이스 서버에서 다른 시간대를 사용하는 UTC는 데이터베이스에서 추출된 날짜를 이동합니다. - " " " " " " " " " " my . " " " " " " my . " " " my . cnf " " ( " / ) " " " " " " " " " " " " " " " " " " my . cnf " 0 " 행을 하여 my . ( windows / )" " " 0 " " " " " " " " " " " " " )
default-time-zone='+00:00'
(이 StackOverflow 투고 상세) - AWS(amazon 웹 서비스)에 구성된 데이터베이스에는 UTC+0 기본 시간이 자동으로 할당됩니다(여기 AWS 도움말 페이지 참조).
Maven을 사용하는 경우 다른 MySQL 커넥터 버전을 설정할 수 있습니다(같은 오류가 발생하여 6.0.2에서 5.1.39로 변경).pom.xml
:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
다른 답변에서 보고된 바와 같이 이 문제는 버전 6.0.3 이상에서 수정되었으므로 업데이트된 버전을 사용할 수 있습니다.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.3</version>
</dependency>
은 Maven을 를 재구축합니다.pom.xml
연결 문자열은 다음과 같이 설정해야 합니다.
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
에서 하고 있는 xml
: 파(:persistence.xml
,standalone-full.xml
( ) ) 대 of of of of of대신,&
도 이렇게 써야 요.&
'어느 정도'를 쓰거나요.CDATA
serverTimeZone=을 추가하는 했습니다.application.properties의 .
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC
아래 연결 문자열을 URL에 넣는 것을 해결했습니다.
jdbc:mysql://localhost:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
이는 버전 5.1.33 ~5.1.37의 mysql-connector-java 오류입니다.보고는 이쪽에서 합니다.http://bugs.mysql.com/bug.php?id=79343
편집: 이것은 mysql-connector-java 5.1.39에서 수정되었습니다.
loadTimeZoneMappings 메서드의 TimeUtil 클래스의 오타가 발생하여 NPE locationing /com/mysql/jdbc/TimeZoneMapping.properties 파일이 생성되었습니다.코드를 보면 파일은 TimeZone이 아닌 TimeUtil 클래스 로더 내에 있어야 합니다.
TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE);
useLegacyDatetimeCode 파라미터를 사용하면 날짜를 사용할 때 클라이언트와 서버 시간대의 차이를 자동으로 수정할 수 있습니다.따라서 각 부분에 시간대를 지정할 필요가 없습니다.serverTimeZone 파라미터를 사용하는 것은 회피책이지만 패치가 출시되는 동안 저처럼 스스로 코드를 수정해 볼 수 있습니다.
스탠드아론 어플리케이션일 경우 수정된 com/mysql/jdbc/TimeUtil 클래스를 코드에 추가하여 jar 로드 순서에 주의할 수 있습니다.도움이 될 수 있습니다.https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html
웹 어플리케이션일 경우 .class를 원래 jar로 직접 대체하여 mysql-connector-java-5.1.37-patched.jar를 작성하는 것이 더 쉬운 솔루션입니다.
mysql config 파일에 mysqld 섹션을 추가했습니다.
default_time_zone='+03:00'
mysql 서버를 재시작합니다.
sudo service mysql restart
여기서 +03:00 내 UTC 표준시간대.
os ubuntu 16.04 설정 파일 경로:
/etc/mysql/mysql.conf.d/mysqld.cnf
경고: 표준 시간대에 여름과 겨울 시간이 있는 경우. 시간을 변경하면 구성에서 UTC를 변경해야 합니다. 연 2회(통상) 또는 CRONTAB를 SUDO로 설정해야 합니다.
내 URL jdbc 연결:
"jdbc:mysql://localhost/java"
위의 프로그램은 해당 시간대 오류를 생성합니다.
에 다음해야 합니다.?useTimezone=true&serverTimezone=UTC
코드를 입력하면 정상적으로 동작합니다.
행운을 빈다 :)
데이터베이스 측에서 팔로잉을 실행했습니다.
mysql> SET @@global.time_zone = '+00:00';
mysql> SET @@session.time_zone = '+00:00';
mysql> SELECT @@global.time_zone, @@session.time_zone;
서버 버전 8.0.17 - MySQL Community Server - GPL을 사용하고 있습니다.
출처 : https://community.oracle.com/thread/4144569?start=0&tstart=0
같은 문제가 있어 해결했습니다.add " ? server Timezone ="만 추가해 주세요.UTC"를 문자열 연결로 연결합니다.
#sinossi 내 문제:
java.sql.SQLException:서버 시간대 값 'CEST'가 인식되지 않거나 둘 이상의 시간대를 나타냅니다.타임 존의 서포트를 이용하는 경우는, 서버 또는 JDBC 드라이버(serverTimezone 설정 속성 경유)를, 보다 특정의 타임 존 값을 사용하도록 설정할 필요가 있습니다.
my dbDriver = com.mysql.jdbc.Driver
my jar = mysql-connector-java-8.0.12.jar
my java = 1.8
my tomcat = Apache Tomcat Version 8.5.32
my MySql server = MySql ver.8.0.12
를 것serverTimezone
:
String url = "jdbc:mysql://localhost:3306/db?serverTimezone=" + TimeZone.getDefault().getID()
MySQL 커넥터는 Maven 의존관계에서 사용할 수 있습니다.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.14</version>
</dependency>
다음 '다 하다'에서.application.properties
파일,
spring.datasource.url=jdbc:mysql://localhost:3306/UserReward?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=testuser
spring.datasource.password=testpassword
# MySQL driver
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
UTC 로를 들어 UTC 의 경우).jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
응용 프로그램/하드웨어 서버가 이 시간대에 없는 경우에도 마찬가지입니다.중요한 것은 애플리케이션 연결 문자열 + 데이터베이스를 동일한 시간대와 동기화하는 것입니다.
단순히 「 」 「 」 「 」 「 」를 설정하는 것.serverTimezone=UTC
가 모두 됩니다.
mysql-connector-java-8.0.13을 사용하고 있는데 같은 문제가 발생했습니다.명령줄 콘솔에서 데이터베이스를 만들고 명령줄에서 @Dimitry Rud의 솔루션을 사용하여 이 문제를 해결했습니다.
SET GLOBAL time_zone = '-6:00';
아무것도 재기동할 필요가 없고, 시간을 설정하고, 곧바로 일식 속에서 코드를 실행할 필요가 없어, 문제없이 접속할 수 있었습니다.
이 버그는 이전 버전에서 수정될 예정이지만, 콘솔에서 데이터베이스를 작성한 후 이 설정을 하지 않았기 때문에 이 오류가 발생한 것 같습니다.이를 관리하기 위해 콘솔이 아닌 워크벤치나 다른 앱을 사용하고 있지 않습니다.
버전 5.1.33의 MySQL JDBC 드라이버를 UTC 타임존과 연동시키려면 접속 문자열에 serverTimezone을 명시적으로 지정해야 합니다.
spring.datasource.url = jdbc:mysql://localhost:3306/quartz_demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
mysql 워크벤치에서 다음 SQL 문을 실행합니다.
- SET @@global.time_zone = '+00:00';
- SET @@set.time_zone = '+00:00';
다음 sql 문을 사용하여 값이 설정되었는지 확인합니다.
SELECT @@globaltime_zone, @@syslog.time_zone;
이건 나한테 효과가 있었어.
DBeaver 6.0 : [ Connection Settings ]> [ Driver Properties ]> [ Server Time Zone ]> [ Set UTC ]으로 이동합니다.
또한 spring boot config에서는 속성보다 낮게 설정해야 합니다.
jdbc:mysql://localhost:/? serverTimezone=LACE
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/resultout? useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC","root",""))
이것은 실제로 이 문제에 대한 해결책입니다.단, 복사하여 프로그램에 붙여넣기만 하는 것은 아닙니다.한 줄만 읽으면 'resultout'이 나오는데, 이것이 내 데이터베이스 이름이고, 너는 너의 것을 써야 한다.
3개의 문자열 컴포넌트가 있습니다.첫 번째는 url, 두 번째는 사용자 이름, 세 번째는 비밀번호입니다.위 단락에서는 url을 삭제했습니다.두 번째 및 세 번째 String 컴포넌트는 사용자 이름과 비밀번호에 따라 변경해야 합니다.
고마워요.
윈도우에서 스프링 부트 프로젝트를 진행하려고 할 때도 같은 문제가 있었습니다.
데이터 소스 URL은 다음과 같습니다.
spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
mysql DB에 대한 아래 쿼리를 실행하여 오류를 해결합니다.
MariaDB [xxx> SET @@global.time_zone = '+00:00';
Query OK, 0 rows affected (0.062 sec)
MariaDB [xxx]> SET @@session.time_zone = '+00:00';
Query OK, 0 rows affected (0.000 sec)
MariaDB [xxx]> SELECT @@global.time_zone, @@session.time_zone;
같은 에러가 발생했습니다만, 서버의 타임 존의 값은 「Afr. centrale Ouest」이기 때문에, 다음의 순서를 실행했습니다.
MyError (인텔리J IDEA 커뮤니티 에디션):
InvalidConnectionAttributeException: The server time zone value 'Afr. centrale Ouest' 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 u....
mysql 서버를 SQL Server 8.0(MYSql80)으로 업그레이드했을 때 이 문제가 발생했습니다.
이 문제에 대한 가장 간단한 해결책은 MYSQL Workbench에 다음 명령을 작성하는 것입니다.
SET GLOBAL time_zone = '+1:00'
타임존 뒤의 값은 GMT+/- 타임존의 차이와 같습니다.위의 예는 북아프리카(GMT+1:00) / 또는 인도(GMT+5:30)입니다.그것은 문제를 해결할 것이다.
Mysql Workbench에 다음 코드를 입력하고 쿼리를 실행합니다.
글귀에 를 추가했습니다./etc/mysql/my.cnf
삭제:
default_time_zone='+00:00'
MySQL 서버를 재기동했다.
systemctl restart mysql
그리고 그것은 마법처럼 작용한다.
application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/db?serverTimezone=Europe/Berlin
했습니다.CET
CEST
★★★★★pom.xml
는 maven 합니다.
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
Libre Office Base 에저た 、 Libre Office Base 。그래서 접속 문자열에 '일광 절약 시간대'가 아닌 시간대를 지정했습니다.
&serverTimezone=MST를 사용하지 않고 시도했지만 그것도 실패했습니다.
"&server Timezone="도 시도했지만 실패했기 때문에 서머타임이 마음에 들지 않습니다!
제 경우 테스트 환경이었기 때문에 기존 애플리케이션을 구성 변경 없이, 가능하면 MySQL 구성 변경 없이 작동하도록 만들어야 했습니다.@vinnyjames의 제안에 따라 서버 시간대를 UTC로 변경함으로써 문제를 해결할 수 있었습니다.
ln -sf /usr/share/zoneinfo/UTC /etc/localtime
service mysqld restart
나는 그것을 하는 것으로 그 문제를 해결하기에 충분했다.
코드 변경 없이 이 문제를 해결했습니다.시스템 시간 설정 및 시간대 설정만 하면 됩니다.제 경우 기본 시간대는 UTC로 로컬 시간대로 변경했습니다.모든 서비스를 재시작한 후 모든 것이 작동했습니다.
늦었지만, 만약 당신이 아래의 오류로 인해 어려움을 겪고 있고 데이터소스(javax.sql)를 사용하고 있다면.데이터 소스):
The server time zone value 'CEST' is unrecognized or represents more than one time zone.
다음 행을 설정하여 오류를 제거합니다.
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerTimezone("UTC");
같은 에러가 발생해, 제 경우는 서버 포토 번호를 3308로 변경했습니다만, 이전에는 3306이었습니다.그러면 내 프로젝트가 MySQL 데이터베이스에 연결됩니다.
여기에서는 접속 코드도 변경해야 합니다.
Class.forName("com.mysql.cj.jdbc.Driver");
cn=(java.sql.Connection)DriverManager.getConnection("jdbc:mysql://localhost:3308/test2?zeroDateTimeBehavior=convertToNull","root","");
를 변경하는 합니다.localhost:3308
에러를 해결합니다.
언급URL : https://stackoverflow.com/questions/26515700/mysql-jdbc-driver-5-1-33-time-zone-issue
'programing' 카테고리의 다른 글
vue 구성 요소에서 vuex에서 필터링된 데이터가 반응하지 않음 (0) | 2022.08.01 |
---|---|
VueJ를 사용한 체크박스 필터링s (0) | 2022.08.01 |
C 프로그래밍용 REP가 있습니까? (0) | 2022.08.01 |
Android, 문자열에서 리소스 ID를 가져오고 있습니까? (0) | 2022.08.01 |
Java에서 equals 메서드와 hashCode 메서드를 덮어쓸 필요가 있는 이유는 무엇입니까? (0) | 2022.08.01 |