MySQL JDBC Driver 5.1.33 – Problema de zona horaria

Algunos antecedentes:

Tengo una webapp Java 1.6 ejecutándose en Tomcat 7. La base de datos es MySQL 5.5. Anteriormente, estaba usando el controlador Mysql JDBC 5.1.23 para conectarme a la base de datos. Todo funcionó. Recientemente me actualicé al controlador Mysql JDBC 5.1.33. Después de la actualización, Tomcat lanzaría este error al iniciar la aplicación.

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. 

¿Por qué está pasando esto?

Aparentemente, para obtener la versión 5.1.33 del controlador JDBC de MySQL para que funcione con la zona horaria UTC, se debe especificar el serverTimezone explícitamente en la cadena de conexión.

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

Si está utilizando Maven, puede simplemente configurar otra versión del conector MySQL (tuve el mismo error, así que cambié de 6.0.2 a 5.1.39) en pom.xml :

  mysql mysql-connector-java 5.1.39  

Como se informó en otras respuestas, este problema se ha solucionado en las versiones 6.0.3 o posteriores, por lo que puede usar la versión actualizada:

  mysql mysql-connector-java 6.0.3  

Maven volverá a generar automáticamente su proyecto después de guardar el archivo pom.xml .

La cadena de conexión debe establecerse de esta manera:

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

Si está definiendo la conexión en un archivo xml (como persistence.xml , standalone-full.xml , etc.), en lugar de & debe usar & o usa un bloque CDATA .

Este es un error en mysql-connector-java de la versión 5.1.33 a la 5.1.37. Lo he informado aquí: http://bugs.mysql.com/bug.php?id=79343

Editado: Esto ha sido corregido de mysql-connector-java 5.1.39

Fue un error tipográfico en la clase TimeUtil en el método loadTimeZoneMappings que genera un archivo /com/mysql/jdbc/TimeZoneMapping.properties de localización de NPE. Si observa el código, el archivo debe ubicarse dentro del cargador de clases TimeUtil, no en TimeZone:

 TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE); 

El parámetro useLegacyDatetimeCode permite corregir la diferencia entre las zonas horarias del cliente y del servidor de forma automática al usar las fechas. Por lo tanto, le ayuda a no tener que especificar las zonas horarias en cada parte. Aunque el uso del parámetro serverTimeZone es una solución alternativa, y mientras tanto se libera el parche, puede intentar corregir mejor el código usted mismo como yo lo hice.

  • Si se trata de una aplicación independiente, puede simplemente intentar agregar una clase corregida com / mysql / jdbc / TimeUtil a su código y tenga cuidado con el orden de carga de jar. Esto puede ayudar: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

  • Si se trata de una aplicación web, la solución más fácil es crear su propio mysql-connector-java-5.1.37-patched.jar, sustituyendo el .class directamente en el jar original.

He resuelto este problema configurando MySQL.

SET GLOBAL time_zone = '+3:00';

Resolví poner debajo de la cadena de conexión en la URL

 jdbc:mysql://localhost:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC 
  1. Añadí en el archivo de configuración de mysql en la sección [mysqld]

     default_time_zone='+03:00' 
  2. Y reinicie el servidor mysql:

     sudo service mysql restart 

Donde +03: 00 mi zona horaria UTC.

Ruta al archivo de configuración en mi os ubuntu 16.04:

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

ADVERTENCIA: SI SU HUSO HORIZONTAL TIENE TIEMPO DE VERANO E INVIERNO. DEBE CAMBIAR UTC EN LA CONFIGURACIÓN SI CAMBIA EL TIEMPO. DOS VECES AL AÑO (EN GENERAL) O FIJE CRONTAB CON SUDO.

Mi conexión url jdbc:

 "jdbc:mysql://localhost/java" 

Resolví este problema sin ningún cambio de código único. simplemente pase a la configuración del tiempo del sistema y configure la zona horaria. En mi caso, la zona horaria predeterminada era UTC, que cambié a mi zona horaria local. Después de reiniciar todos los servicios, todo funcionó para mí.

Tengo el mismo problema y lo resolví anexar solo “? ServerTimezone = UTC” a mi conexión de cadena.

#

Sinossi mi problema:

java.sql.SQLException: el valor de zona horaria del servidor ‘CEST’ no se reconoce o representa más de una zona horaria. Debe configurar el servidor o el controlador JDBC (a través de la propiedad de configuración serverTimezone) para usar un valor de zona horaria más específico si desea utilizar el soporte de zona horaria.

 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 

También estaba teniendo exactamente el mismo problema en LibreOffice Base. Así que solo especifiqué una zona horaria no ‘de horario de verano’ en la cadena de conexión.
** ingrese la descripción de la imagen aquí **

Intenté sin el “& serverTimezone = MST” pero eso también falló.

También probé “& serverTimezone = MDT” y eso falló, así que por alguna razón, ¡no le gusta el horario de verano!

paquete paquete1;

importar java.sql.Connection; importar java.sql.DriverManager;

import javax.swing.JOptionPane;

clase pública 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'; } } 

}