Driver JDBC MySQL 5.1.33 – Problema del fuso orario

Qualche background:

Ho una webapp Java 1.6 in esecuzione su Tomcat 7. Il database è MySQL 5.5. In precedenza, stavo usando Mysql JDBC driver 5.1.23 per connettersi al DB. Tutto ha funzionato. Di recente ho eseguito l’aggiornamento a Mysql JDBC driver 5.1.33. Dopo l’aggiornamento, Tomcat genererebbe questo errore all’avvio dell’app.

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. 

Perché sta succedendo?

Apparentemente, per far funzionare la versione 5.1.33 del driver JDBC MySQL con il fuso orario UTC, è necessario specificare esplicitamente il serverTimezone nella stringa di connessione.

 jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC 

Se stai usando Maven, puoi semplicemente impostare un’altra versione del connettore MySQL (ho avuto lo stesso errore, quindi ho cambiato da 6.0.2 a 5.1.39) in pom.xml :

  mysql mysql-connector-java 5.1.39  

Come riportato in altre risposte, questo problema è stato risolto nelle versioni 6.0.3 o successive, quindi puoi utilizzare la versione aggiornata:

  mysql mysql-connector-java 6.0.3  

Maven ricostruirà automaticamente il tuo progetto dopo aver salvato il file pom.xml .

La stringa di connessione dovrebbe essere impostata in questo modo:

 jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC 

Se stai definendo la connessione in un file xml (come persistence.xml , standalone-full.xml , ecc.), Invece di & dovresti usare & o utilizzare un blocco CDATA .

Questo è un bug in mysql-connector-java dalla versione 5.1.33 alla 5.1.37. L’ho segnalato qui: http://bugs.mysql.com/bug.php?id=79343

Modificato: questo è stato corretto da mysql-connector-java 5.1.39

È stato un errore di battitura nella class TimeUtil nel metodo loadTimeZoneMappings che genera un file di localizzazione NPE /com/mysql/jdbc/TimeZoneMapping.properties. Se si guarda il codice, il file deve trovarsi all’interno del caricatore della class TimeUtil, non TimeZone:

 TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE); 

Il parametro useLegacyDatetimeCode consente di correggere automaticamente la differenza tra i fusi orari del client e del server quando si utilizzano le date. Quindi ti aiuta senza dover specificare i fusi orari in ciascuna parte. Sebbene utilizzare il parametro serverTimeZone sia una soluzione, e nel frattempo la patch viene rilasciata, puoi provare a correggere meglio il codice da solo come ho fatto io.

  • Se si tratta di un’applicazione standalone, è ansible provare semplicemente ad aggiungere una class corretta com / mysql / jdbc / TimeUtil al proprio codice e fare attenzione con l’ordine di caricamento dei jar. Questo può aiutare: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

  • Se si tratta di un’applicazione Web, la soluzione più semplice è creare il proprio mysql-connector-java-5.1.37-patched.jar, sostituendo la class .class direttamente nel jar originale.

Ho risolto questo problema configurando MySQL.

SET GLOBAL time_zone = '+3:00';

Ho risolto mettendo sotto la stringa di connessione nell’URL

 jdbc:mysql://localhost:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC 
  1. Ho aggiunto il file di configurazione mysql nella sezione [mysqld]

     default_time_zone='+03:00' 
  2. E riavvia il server mysql:

     sudo service mysql restart 

Dove +03: 00 il mio fuso orario UTC.

Percorso per il file di configurazione sul mio os ubuntu 16.04:

 /etc/mysql/mysql.conf.d/mysqld.cnf 

ATTENZIONE: SE LA TUA ZONA DI TEMPO HA TEMPO ESTIVO E INVERNALE. DEVI CAMBIARE UTC IN CONFIG IF SE SI CAMBIA. DUE VOLTE IN ANNO (SOLO) O IMPOSTARE CRONTAB CON SUDO.

La mia connessione jdbc url:

 "jdbc:mysql://localhost/java" 

Ho risolto questo problema senza alcun cambio di codice singolo. basta andare a impostare l’ora del sistema e impostare il fuso orario. Nel mio caso il fuso orario predefinito era UTC, che ho modificato con il fuso orario locale. Dopo aver riavviato tutti i servizi, tutto ha funzionato per me.

Ho lo stesso problema e ho risolto aggiungere “? ServerTimezone = UTC” alla mia connessione di stringa.

#

sinossi il mio problema:

java.sql.SQLException: il valore del fuso orario del server ‘CEST’ non è riconosciuto o rappresenta più di un fuso orario. È necessario configurare il server o il driver JDBC (tramite la proprietà di configurazione serverTimezone) per utilizzare un valore di fuso orario più specifico se si desidera utilizzare il supporto del fuso orario.

 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 

Avevo anche lo stesso identico problema in LibreOffice Base. Quindi ho appena specificato un non “fuso orario legale” nella stringa di connessione.
** inserisci la descrizione dell'immagine qui **

Ho provato senza “& serverTimezone = MST” ma anche quello è fallito.

Ho anche provato “& serverTimezone = MDT” e questo non è riuscito, quindi per qualche motivo, non mi piace l’ora legale!

pacchetto pack1;

import java.sql.Connection; import java.sql.DriverManager;

import javax.swing.JOptionPane;

public class sqliteConnection {Connection conn = null;

 public static Connection dbConnector() { try {Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306","root",""); JOptionPane.showMessageDialog(null, "connection is succesful"); return conn; }catch(Exception e) { JOptionPane.showMessageDialog(null, e); return null; ////you need also to execute this in database ===> SET GLOBAL time_zone = '+3:00'; } } 

}