Beberapa latar belakang:
Saya memiliki webapp Java 1.6 yang berjalan di Tomcat 7. Basis datanya adalah MySQL 5.5. Sebelumnya, saya menggunakan driver Mysql JDBC 5.1.23 untuk terhubung ke DB. Semuanya berhasil. Saya baru-baru ini ditingkatkan ke driver Mysql JDBC 5.1.33. Setelah peningkatan, Tomcat akan melempar kesalahan ini ketika memulai aplikasi.
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.
Mengapa ini terjadi?
Jawaban:
Rupanya, untuk mendapatkan versi 5.1.33 dari driver MySQL JDBC untuk bekerja dengan zona waktu UTC, kita harus menentukan
serverTimezone
secara eksplisit dalam string koneksi.sumber
Saya telah memecahkan masalah ini dengan mengkonfigurasi MySQL.
SET GLOBAL time_zone = '+3:00';
sumber
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow
. Sepertinya mysql-connector tidak mengerti nama zona waktu pendek.Setelah membaca beberapa posting tentang topik ini, menguji berbagai konfigurasi dan berdasarkan pada beberapa wawasan dari utas bug mysql ini, itulah yang saya mengerti:
useLegacyDatetimeCode=true
, yang bersamaan denganuseJDBCCompliantTimezoneShift=true
akan membuat aplikasi mendapatkan zona waktu basis data pada setiap koneksi. Dalam mode ini, zona waktu GMT seperti 'Waktu Musim Panas Inggris' akan dikonversi ke format java / JDBC internal. Zona waktu baru dapat didefinisikan dalam file .properties seperti iniuseJDBCCompliantTimezoneShift
) dan format waktu lama (useLegacyDatetimeCode
) dihapus ( lihat mysql jdbc connector changelog ). karena itu pengaturan 2 parameter ini tidak berpengaruh karena diabaikan sepenuhnya (default baru adalahuseLegacyDateTimeCode=false
)serverTimezone
menjadi wajib jika salah satu zona waktu (server aplikasi / database) tidak dalam format 'UTC + xx' atau 'GMT + xx'jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, bahkan jika server aplikasi / basis data Anda tidak berada dalam zona waktu ini. Yang penting adalah agar string koneksi aplikasi + basis data disinkronkan dengan zona waktu yang sama. Dengan kata lain , cukup mengatur serverTimezone = UTC dengan zona waktu yang berbeda pada server database akan menggeser setiap tanggal yang diekstrak dari databasedefault-time-zone='+00:00'
(perincian dalam pos StackOverflow ini )sumber
default-time-zone = '+00:00'
homebrew/usr/local/etc/my.cnf
. Tampaknya ruang di sekitar=
itu penting sehingga Anda dapat mengedit peluru itu untuk memasukkannya.Jika Anda menggunakan Maven, Anda bisa mengatur versi konektor MySQL yang lain (saya mengalami kesalahan yang sama, jadi saya berubah dari 6.0.2 ke 5.1.39) di
pom.xml
:Seperti yang dilaporkan dalam jawaban lain, masalah ini telah diperbaiki di versi 6.0.3 atau lebih tinggi, sehingga Anda dapat menggunakan versi yang diperbarui:
Maven akan secara otomatis membangun kembali proyek Anda setelah Anda menyimpan
pom.xml
file.sumber
6.0.6
diam. lebih baik menggunakan solusi di atasString koneksi harus diatur seperti ini:
Jika Anda mendefinisikan koneksi dalam
xml
file (sepertipersistence.xml
,standalone-full.xml
, dll ..), bukan&
Anda harus menggunakan&
atau menggunakanCDATA
blok.sumber
Ini adalah bug di mysql-connector-java dari versi 5.1.33 ke 5.1.37. Saya sudah melaporkannya di sini: http://bugs.mysql.com/bug.php?id=79343
Diedit: Ini telah diperbaiki dari mysql-connector-java 5.1.39
Itu adalah kesalahan ketik di kelas TimeUtil dalam metode loadTimeZoneMappings yang meningkatkan lokasi NPE /com/mysql/jdbc/TimeZoneMapping.properties file. Jika Anda melihat kode, file tersebut harus berada di dalam loader kelas TimeUtil, bukan TimeZone:
Parameter useLegacyDatetimeCode memungkinkan untuk memperbaiki perbedaan antara zona waktu klien dan server secara otomatis saat menggunakan tanggal. Jadi ada baiknya Anda tidak harus menentukan zona waktu di setiap bagian. Meskipun menggunakan parameter serverTimeZone adalah solusi, dan sementara itu tambalan dilepaskan, Anda dapat mencoba memperbaiki kode sendiri seperti yang saya lakukan.
Jika ini adalah aplikasi mandiri, Anda dapat mencoba hanya menambahkan kelas com / mysql / jdbc / TimeUtil yang diperbaiki ke kode Anda dan berhati-hati dengan urutan pemuatan jar. Ini dapat membantu: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html
Jika ini adalah aplikasi web, solusi yang lebih mudah adalah membuat mysql-connector-java-5.1.37-patched.jar Anda sendiri, dengan mengganti .class langsung ke toples asli.
sumber
TimeZone.getAvailableIDs()
maupun dalamTimeZoneMapping.properties
sehingga solusi ini tidak akan membantu di sini. Solusinya mungkin akan diatur sepertiserverTimezone=Europe/Berlin
Saya memutuskan meletakkan string koneksi di bawah ini di URL
sumber
Ini bekerja untuk saya hanya dengan menambahkan serverTimeZone = UTC pada application.properties.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC
sumber
Saya menambahkan file konfigurasi mysql di bagian [mysqld]
Dan restart server mysql:
Di mana +03: 00 zona waktu UTC saya.
Path ke file config di os ubuntu 16.04 saya:
PERINGATAN: JIKA ZONA WAKTU ANDA MEMILIKI MUSIM PANAS DAN WAKTU MUSIM DINGIN. ANDA HARUS MENGUBAH UTC DALAM KONFIGASI JIKA MENGUBAH WAKTU. DUA KALI DALAM TAHUN (BIASANYA) ATAU SET CRONTAB DENGAN SUDO.
Koneksi jdbc url saya:
sumber
default-time-zone='+03:00'
sebagai gantinya, sesuai jawaban ini . Juga datang dari DBeaver.Saya memiliki masalah yang sama dan saya menyelesaikannya dengan menambahkan hanya "? ServerTimezone = UTC" ke koneksi string saya.
#sinossi masalah saya:
java.sql.SQLException: Nilai zona waktu server 'CEST' tidak dikenal atau mewakili lebih dari satu zona waktu. Anda harus mengonfigurasi server atau driver JDBC (melalui properti konfigurasi serverTimezone) untuk menggunakan nilai zona waktu yang lebih spesifik jika Anda ingin menggunakan dukungan zona waktu.
sumber
Program di atas akan menghasilkan kesalahan zona waktu itu.
Setelah nama database Anda, Anda harus menambahkan ini:
?useTimezone=true&serverTimezone=UTC
. Setelah selesai, kode Anda akan berfungsi dengan baik.Semoga berhasil :)
sumber
Saya mengeksekusi berikut di sisi database saya.
Saya menggunakan versi Server: 8.0.17 - MySQL Community Server - GPL
sumber: https://community.oracle.com/thread/4144569?start=0&tstart=0
sumber
Segala yang kami butuhkan untuk memperbaiki masalah dengan
serverTimezone
:sumber
Anda dapat menggunakan konektor MySQL di ketergantungan Maven,
Maka Anda perlu mengatur parameter yang tepat dalam
application.properties
file tersebut,sumber
Saya menggunakan mysql-connector-java-8.0.13 dan memiliki masalah yang sama. Saya membuat basis data saya di konsol baris perintah dan memecahkan masalah ini dengan menggunakan solusi @Dimitry Rud di baris perintah:
Saya tidak perlu me-restart apa pun, mengatur waktu dan segera menjalankan kode saya di gerhana, itu terhubung tanpa masalah.
Bug seharusnya diperbaiki dalam versi yang lebih lama, tetapi saya rasa saya mendapatkan kesalahan ini karena setelah saya membuat database di konsol, saya tidak mengatur ini. Saya tidak menggunakan meja kerja atau aplikasi lain untuk mengelola ini daripada konsol.
sumber
Dari mysql workbench, jalankan pernyataan sql berikut:
dengan pernyataan sql berikut periksa apakah nilainya ditetapkan:
SELECT @@ global.time_zone, @@ session.time_zone;
sumber
Ini berhasil untuk saya.
pada DBeaver 6.0: Buka Pengaturan Koneksi> Properti Driver> Zona Waktu Server> Atur UTC.
Juga, dalam konfigurasi booting pegas, harus mengatur properti di bawah ini.
jdbc: mysql: // localhost: /? serverTimezone = UTC
sumber
Rupanya, untuk mendapatkan driver MySQL JDBC versi 5.1.33 agar berfungsi dengan zona waktu UTC, kita harus menentukan serverTimezone secara eksplisit dalam string koneksi.
sumber
Saya juga mengalami masalah yang sama persis di LibreOffice Base. Jadi saya hanya menentukan zona waktu 'daylight saving time' di string koneksi.
Saya mencoba tanpa "& serverTimezone = MST" tetapi gagal juga.
Saya juga mencoba "& serverTimezone = MDT" dan gagal, jadi untuk beberapa alasan, tidak suka waktu musim panas!
sumber
Saya memiliki masalah yang sama ketika saya mencoba untuk bekerja dengan proyek spring boot di windows.
Url data sumber harus:
spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
sumber
Jalankan query di bawah ini ke mysql DB untuk menyelesaikan kesalahan
sumber
i Got error mirip dengan Anda tetapi nilai zona waktu server saya adalah 'Afr. centrale Ouest 'jadi saya melakukan langkah-langkah ini:
MyError (pada IntelliJ IDEA Community Edition):
Saya menghadapi masalah ini ketika saya memutakhirkan server mysql saya ke SQL Server 8.0 (MYSQL80).
Solusi paling sederhana untuk masalah ini adalah cukup tulis perintah di bawah ini di MYSQL Workbench Anda -
Nilai setelah zona waktu akan sama dengan GMT +/- Perbedaan di zona waktu Anda. Contoh di atas adalah untuk Afrika Utara (GMT + 1: 00) / atau untuk India (GMT + 5: 30). Ini akan menyelesaikan masalah.
Masukkan kode berikut di Mysql Workbench Anda dan jalankan quesry
[tautan sumber untuk pertanyaan / masalah]
[tautan sumber untuk jawaban]
[Solution ScreenShot]
sumber
Ini sebenarnya solusi untuk masalah ini, tetapi jangan hanya menyalin dan menempelnya di program Anda. Jika Anda baru saja membaca baris Anda akan menemukan 'resultout', itulah nama database saya, dan Anda harus menulis milik Anda.
Ada tiga komponen string, yang pertama adalah url, yang kedua adalah nama pengguna, dan yang ketiga adalah kata sandi. Pada paragraf di atas kami membersihkan, url. Komponen String kedua dan ketiga seperti kata nama pengguna dan kata sandi Anda, Anda harus mengubah sesuai.
Terima kasih
sumber
Saya memecahkan masalah ini tanpa perubahan kode tunggal. hanya pengaturan waktu sistem goto dan mengatur zona waktu. Dalam kasus saya, zona waktu default adalah UTC yang saya ubah menjadi zona waktu lokal saya. Setelah saya me-restart semua layanan, semuanya bekerja untuk saya.
sumber
Saya terlambat, Tapi Jika Anda berjuang melalui kesalahan berikut dan menggunakan sumber data (javax.sql.DataSource):
Tetapkan baris berikut untuk menghilangkan kesalahan:
sumber
Dalam kasus saya, itu adalah lingkungan pengujian dan saya harus membuat aplikasi yang sudah ada untuk bekerja tanpa perubahan konfigurasi, dan jika mungkin tanpa perubahan konfigurasi MySQL. Saya dapat memperbaiki masalah ini dengan mengikuti saran @vinnyjames dan mengubah zona waktu server ke UTC :
Melakukan itu sudah cukup bagi saya untuk menyelesaikan masalah.
sumber
Saya telah menambahkan baris berikut ke
/etc/mysql/my.cnf
file saya :Mulai ulang server MySQL:
Dan itu berfungsi seperti pesona.
sumber
Tidak ada dampak pengaturan waktu server sebagai UTC (misalnya dengan
jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, bahkan jika server aplikasi / basis data Anda tidak berada dalam zona waktu ini. Yang penting adalah agar string koneksi aplikasi + basis data disinkronkan dengan zona waktu yang sama.Dengan kata lain, hanya pengaturan
serverTimezone=UTC
dengan zona waktu yang berbeda pada server database akan menggeser setiap tanggal yang diekstrak dari databasesumber
Setuju dengan jawaban @bluecollarcoder, tetapi lebih baik digunakan
TimeZone.getDefault().getID();
di akhir string koneksi:Dalam hal ini
Timezone
parameter diperbarui secara otomatis tergantung pada zona waktu mesin lokal.sumber
Cukup modifikasi string koneksi dengan kode berikut di file application.properties.
sumber