Algunos antecedentes:
Tengo una aplicación web Java 1.6 que se ejecuta 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 actualicé al controlador Mysql JDBC 5.1.33. Después de la actualización, Tomcat arrojarí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?
Respuestas:
Aparentemente, para que la versión 5.1.33 del controlador JDBC de MySQL funcione con la zona horaria UTC, se debe especificar
serverTimezone
explícitamente en la cadena de conexión.fuente
He resuelto este problema configurando MySQL.
SET GLOBAL time_zone = '+3:00';
fuente
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow
. Parece que mysql-connector no comprende nombres cortos de zonas horarias.Después de leer varias publicaciones sobre este tema, probar diferentes configuraciones y basarme en algunas ideas de este hilo de errores de mysql, eso es lo que he entendido:
useLegacyDatetimeCode=true
, lo que en conjunto conuseJDBCCompliantTimezoneShift=true
la aplicación haría que la zona horaria de la base de datos en cada conexión. En este modo, las zonas horarias GMT como 'British Summer Time' se convertirían al formato interno java / JDBC. Se pueden definir nuevas zonas horarias en un archivo .properties como esteuseJDBCCompliantTimezoneShift
) y el formato de tiempo heredado (useLegacyDatetimeCode
) ( consulte el registro de cambios del conector mysql jdbc ). por lo tanto, configurar estos 2 parámetros no tiene ningún efecto ya que se ignoran por completo (el nuevo valor predeterminado esuseLegacyDateTimeCode=false
)serverTimezone
hizo obligatoria si alguna de las zonas horarias (servidores de aplicaciones / bases de datos) no están en el formato 'UTC + xx' o 'GMT + xx'jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, incluso si sus servidores de aplicaciones / bases de datos no están en esta zona horaria. Lo importante es que la cadena de conexión de la aplicación + la base de datos se sincronice con la misma zona horaria. En otras palabras , simplemente configurar serverTimezone = UTC con una zona horaria diferente en el servidor de la base de datos cambiará las fechas extraídas de la base de datosdefault-time-zone='+00:00'
(detalles en esta publicación de StackOverflow )fuente
default-time-zone = '+00:00'
homebrew/usr/local/etc/my.cnf
. Parece que los espacios alrededor=
son importantes, por lo que puede editar esa viñeta para incluirlos.Si está utilizando Maven, puede 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
:Como se informó en otras respuestas, este problema se ha solucionado en las versiones 6.0.3 o superiores, por lo que puede usar la versión actualizada:
Maven reconstruirá automáticamente su proyecto después de guardar el
pom.xml
archivo.fuente
6.0.6
still. mejor usar la solución anteriorLa cadena de conexión debe establecerse así:
Si está definiendo la conexión en un
xml
archivo (por ejemplopersistence.xml
,standalone-full.xml
, etc ..), en lugar de&
que puedes usar&
o usar unCDATA
bloque.fuente
Este es un error en mysql-connector-java de la versión 5.1.33 a 5.1.37. Lo he informado aquí: http://bugs.mysql.com/bug.php?id=79343
Editado: Esto se ha corregido desde mysql-connector-java 5.1.39
Fue un error tipográfico en la clase TimeUtil en el método loadTimeZoneMappings que genera un archivo NPE que localiza /com/mysql/jdbc/TimeZoneMapping.properties. Si observa el código, el archivo debe ubicarse dentro del cargador de clases TimeUtil, no TimeZone:
El parámetro useLegacyDatetimeCode permite corregir la diferencia entre las zonas horarias del cliente y del servidor automáticamente cuando se usan fechas. Por lo tanto, le ayuda a no tener que especificar zonas horarias en cada parte. Aunque usar el parámetro serverTimeZone es una solución alternativa, y mientras se lanza el parche, puede intentar corregir el código usted mismo como lo hice yo.
Si se trata de una aplicación independiente, puede intentar simplemente agregar una clase com / mysql / jdbc / TimeUtil corregida a su código y tener cuidado con el orden de carga de jarras. 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.
fuente
TimeZone.getAvailableIDs()
ni en,TimeZoneMapping.properties
por lo que esta solución no ayudará aquí. Probablemente, la solución se establecería comoserverTimezone=Europe/Berlin
Resolví poner debajo de la cadena de conexión en la URL
fuente
Funcionó para mí simplemente agregando serverTimeZone = UTC en application.properties.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC
fuente
Agregué el archivo de configuración mysql en la sección [mysqld]
Y reinicie el servidor mysql:
Donde +03: 00 mi zona horaria UTC.
Ruta al archivo de configuración en mi os ubuntu 16.04:
ADVERTENCIA: SI SU ZONA HORARIA TIENE TIEMPO DE VERANO E INVIERNO. DEBE CAMBIAR UTC EN CONFIGURACIÓN SI CAMBIA HORA. DOS VECES EN EL AÑO (USUALMENTE) O FIJE LA CRONTAB CON SUDO.
Mi conexión urd jdbc:
fuente
default-time-zone='+03:00'
lugar, según esta respuesta . También viene de DBeaver.Tengo el mismo problema y lo resolví agregando 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.
fuente
El programa anterior generará ese error de zona horaria.
Después de que su nombre de la base de datos hay que añadir lo siguiente:
?useTimezone=true&serverTimezone=UTC
. Una vez que haya hecho su código funcionará bien.La mejor de las suertes :)
fuente
Ejecuté siguiente en mi lado de la base de datos.
Estoy usando la versión del servidor: 8.0.17 - MySQL Community Server - GPL
fuente: https://community.oracle.com/thread/4144569?start=0&tstart=0
fuente
Todo lo que necesitamos para solucionar el problema
serverTimezone
:fuente
Puede usar el conector MySQL en la dependencia Maven,
Luego necesita establecer los parámetros correctos en el
application.properties
archivo,fuente
Estoy usando mysql-connector-java-8.0.13 y tuve el mismo problema. Creé mi base de datos en la consola de línea de comando y resolví este problema usando la solución de @Dimitry Rud en la línea de comando:
No necesitaba reiniciar nada, establecer la hora e inmediatamente ejecutar mi código en eclipse, se conectó sin problemas.
Se supone que el error se corrige en una versión anterior, pero creo que recibí este error porque después de crear la base de datos en la consola, no configuré esto. No estoy usando workbench ni otra aplicación para administrar esto en lugar de la consola.
fuente
Desde mysql workbench ejecute las siguientes instrucciones sql:
con las siguientes instrucciones sql verifique si se establecieron los valores:
SELECCIONE @@ global.time_zone, @@ session.time_zone;
fuente
Esto funcionó para mí.
en DBeaver 6.0: Vaya a Configuración de conexión> Propiedades del controlador> Zona horaria del servidor> Establecer UTC.
Además, en la configuración de arranque de primavera, tenía que establecer la propiedad a continuación.
jdbc: mysql: // localhost: /? serverTimezone = UTC
fuente
Aparentemente, para que la versión 5.1.33 del controlador JDBC de MySQL funcione con la zona horaria UTC, se debe especificar explícitamente la zona horaria del servidor en la cadena de conexión.
fuente
También estaba teniendo exactamente el mismo problema en LibreOffice Base. Así que acabo de especificar una 'zona horaria de horario de verano' que no es en la cadena de conexión.
Lo 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!
fuente
Tuve el mismo problema cuando trato de trabajar con el proyecto de arranque de primavera en Windows.
La URL de la fuente de datos debe ser:
spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
fuente
Ejecute la consulta a continuación a mysql DB para resolver el error
fuente
Obtuve un error similar al tuyo pero mi El valor de zona horaria del servidor es 'Afr. centrale Ouest ', así que hice estos pasos:
MyError (en IntelliJ IDEA Community Edition):
Enfrenté este problema cuando actualicé mi servidor mysql a SQL Server 8.0 (MYSQL80).
La solución más simple a este problema es simplemente escribir el siguiente comando en su MYSQL Workbench:
El valor después de la zona horaria será igual a GMT +/- Diferencia en su zona horaria. El ejemplo anterior es para el norte de África (GMT + 1: 00) / o para India (GMT + 5: 30). Resolverá el problema.
Ingrese el siguiente código en su Mysql Workbench y ejecute la consulta
[enlace fuente para pregunta / problema]
[enlace de origen para la respuesta]
[Captura de pantalla de la solución]
fuente
Esta es realmente la solución a este problema, pero no solo copie y pegue en su programa. Si solo lee la línea, encontrará 'resultado', ese es el nombre de mi base de datos, y tiene que escribir la suya.
Hay tres componentes de cadena, el primero es url, el segundo es nombre de usuario y el tercero es contraseña. En el párrafo anterior borramos, url. Los componentes de la segunda y tercera cadena como su nombre de usuario y contraseña deben cambiar en consecuencia.
Gracias
fuente
Resolví este problema sin ningún cambio de código único. solo vaya a la configuración de hora 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í.
fuente
Llego tarde, pero si está luchando con el siguiente error y está usando datasource (javax.sql.DataSource):
Establezca la siguiente línea para deshacerse del error:
fuente
En mi caso, era un entorno de prueba y tenía que hacer que una aplicación existente funcionara sin ningún cambio de configuración, y si era posible sin ningún cambio de configuración de MySQL. Pude solucionar el problema siguiendo la sugerencia de @vinnyjames y cambiando la zona horaria del servidor a UTC :
Hacer eso fue suficiente para que resolviera el problema.
fuente
He agregado la siguiente línea a mi
/etc/mysql/my.cnf
archivo:Reinició el servidor MySQL:
Y funciona como un encanto.
fuente
No hay impacto de establecer la hora del servidor como UTC (por ejemplo, con
jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, incluso si sus servidores de aplicaciones / bases de datos no están en esta zona horaria. Lo importante es que la cadena de conexión de la aplicación + la base de datos se sincronice con la misma zona horaria).En otras palabras, simplemente configurar
serverTimezone=UTC
con una zona horaria diferente en el servidor de la base de datos cambiará las fechas extraídas de la base de datosfuente
De acuerdo con la respuesta @bluecollarcoder, pero es mejor usarla
TimeZone.getDefault().getID();
al final de la cadena de conexión:En este caso, el
Timezone
parámetro se actualiza automáticamente según la zona horaria de la máquina local.fuente
Simplemente modifique la cadena de conexión con el siguiente código en el archivo application.properties.
fuente