Alguns antecedentes:
Eu tenho um webapp Java 1.6 em execução no Tomcat 7. O banco de dados é MySQL 5.5. Anteriormente, eu estava usando o driver Mysql JDBC 5.1.23 para conectar-se ao banco de dados. Tudo funcionou. Recentemente, atualizei para o driver Mysql JDBC 5.1.33. Após a atualização, o Tomcat lançaria esse erro ao iniciar o aplicativo.
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 que isso está acontecendo?
Respostas:
Aparentemente, para que a versão 5.1.33 do driver JDBC do MySQL funcione com o fuso horário UTC, é necessário especificar o
serverTimezone
explicitamente na cadeia de conexão.fonte
Eu resolvi esse problema configurando o MySQL.
SET GLOBAL time_zone = '+3:00';
fonte
jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow
. Parece que o mysql-connector não entende nomes curtos de fuso horário.Depois de ler várias postagens sobre esse tópico, testando diferentes configurações e com base em algumas informações desse encadeamento de erros do mysql, é o que entendi:
useLegacyDatetimeCode=true
, o que, em conjunto comuseJDBCCompliantTimezoneShift=true
, tornaria o aplicativo o fuso horário do banco de dados em todas as conexões. Nesse modo, os fusos horários GMT, como 'British Summer Time', seriam convertidos para o formato java / JDBC interno. Novos fusos horários podem ser definidos em um arquivo .properties como esteuseJDBCCompliantTimezoneShift
) e o formato de hora herdado (useLegacyDatetimeCode
) foram removidos ( consulte o registro de alterações do mysql jdbc connector ). portanto, a definição desses 2 parâmetros não tem efeito, pois são completamente ignorados (o novo padrão éuseLegacyDateTimeCode=false
)serverTimezone
se torna obrigatória se qualquer um dos fusos horários (servidores de aplicativos / banco de dados) não estiver no formato 'UTC + xx' ou 'GMT + xx'jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, mesmo que os servidores de aplicativos / banco de dados não estejam nesse fuso horário. O importante é que a cadeia de conexão do aplicativo + o banco de dados seja sincronizada com o mesmo fuso horário. Em outras palavras , basta definir serverTimezone = UTC com um fuso horário diferente no servidor do banco de dados, mudando as datas extraídas do banco de dadosdefault-time-zone='+00:00'
(detalhes nesta postagem do StackOverflow )fonte
default-time-zone = '+00:00'
no/usr/local/etc/my.cnf
arquivo homebrew . Parece que os espaços ao redor do=
são importantes, portanto, você pode editar esse marcador para incluí-los.Se você estiver usando o Maven, poderá definir outra versão do conector MySQL (eu tive o mesmo erro, então mudei de 6.0.2 para 5.1.39) em
pom.xml
:Conforme relatado em outras respostas, esse problema foi corrigido nas versões 6.0.3 ou superior, para que você possa usar a versão atualizada:
O Maven recriará automaticamente seu projeto depois que você salvar o
pom.xml
arquivo.fonte
6.0.6
ainda. melhor usar a solução acimaA cadeia de conexão deve ser definida assim:
Se você estiver definindo a conexão em um
xml
arquivo (comopersistence.xml
,standalone-full.xml
, etc ..), em vez de&
você deve usar&
ou usar umCDATA
bloco.fonte
Este é um erro no mysql-connector-java da versão 5.1.33 a 5.1.37. Eu relatei aqui: http://bugs.mysql.com/bug.php?id=79343
Editado: Isso foi corrigido no mysql-connector-java 5.1.39
Foi um erro de digitação na classe TimeUtil no método loadTimeZoneMappings que gera um arquivo NPE localizando /com/mysql/jdbc/TimeZoneMapping.properties. Se você observar o código, o arquivo deverá estar localizado no carregador de classes TimeUtil, e não no TimeZone:
O parâmetro useLegacyDatetimeCode permite corrigir a diferença entre os fusos horários do cliente e do servidor automaticamente ao usar datas. Por isso, ajuda você a não precisar especificar fusos horários em cada parte. Embora o parâmetro serverTimeZone seja uma solução alternativa e, enquanto o patch for lançado, você poderá tentar corrigir o código melhor sozinho, como eu fiz.
Se for um aplicativo independente, você pode simplesmente adicionar uma classe com / mysql / jdbc / TimeUtil corrigida ao seu código e ter cuidado com a ordem de carregamento do jar. Isso pode ajudar: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html
Se for uma aplicação web, a solução mais fácil é criar seu próprio mysql-connector-java-5.1.37-patched.jar, substituindo o .class diretamente no jar original.
fonte
TimeZone.getAvailableIDs()
nem no,TimeZoneMapping.properties
portanto, esta solução não ajudará aqui. A solução provavelmente estaria definindo comoserverTimezone=Europe/Berlin
Resolvi colocar abaixo a string de conexão no URL
fonte
Funcionou para mim apenas adicionando serverTimeZone = UTC em application.properties.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC
fonte
Eu adicionei no arquivo de configuração do mysql na seção [mysqld]
E reinicie o servidor mysql:
Onde + 03: 00 meu fuso horário UTC.
Caminho para o arquivo de configuração no meu sistema operacional ubuntu 16.04:
AVISO: SE O SEU FUSO HORÁRIO TEM TEMPO DE VERÃO E INVERNO. VOCÊ DEVE MUDAR O UTC EM CONFIGURAR SE MUDAR DE HORA. DUAS VEZES NO ANO (geralmente) ou defina CRONTAB COM SUDO.
Minha conexão jdbc url:
fonte
default-time-zone='+03:00'
vez disso, conforme esta resposta . Também vindo do DBeaver.Eu tenho o mesmo problema e resolvi anexar apenas "? ServerTimezone = UTC" à minha conexão de string.
#sinossi meu problema:
java.sql.SQLException: o valor do fuso horário do servidor 'CEST' não é reconhecido ou representa mais de um fuso horário. Você deve configurar o servidor ou o driver JDBC (por meio da propriedade de configuração serverTimezone) para usar um valor de fuso horário mais específico, se desejar utilizar o suporte ao fuso horário.
fonte
O programa acima irá gerar esse erro de fuso horário.
Após o seu nome do banco de dados que você tem que acrescentar o seguinte:
?useTimezone=true&serverTimezone=UTC
. Depois de concluir, seu código funcionará bem.Boa sorte :)
fonte
Eu executei a seguir no meu banco de dados.
Estou usando a versão Server: 8.0.17 - MySQL Community Server - GPL
fonte: https://community.oracle.com/thread/4144569?start=0&tstart=0
fonte
Tudo o que precisamos para resolver o problema
serverTimezone
:fonte
Você pode usar o conector MySQL na dependência do Maven,
Então você precisa definir os parâmetros corretos no
application.properties
arquivo,fonte
Estou usando o mysql-connector-java-8.0.13 e tive o mesmo problema. Criei meu banco de dados no console da linha de comando e resolvi esse problema usando a solução de @Dimitry Rud na linha de comando:
Não precisei reiniciar nada, definir o horário e executar imediatamente meu código no eclipse, ele estava conectado sem problemas.
O bug deve ser corrigido em uma versão mais antiga, mas acho que recebi esse erro porque, depois de criar o banco de dados no console, não o configurei. Não estou usando o ambiente de trabalho nem outro aplicativo para gerenciar isso, e não o console.
fonte
No mysql workbench, execute as seguintes instruções sql:
com as seguintes instruções sql, verifique se os valores foram definidos:
SELECT @@ global.time_zone, @@ session.time_zone;
fonte
Isso funcionou para mim.
no DBeaver 6.0: Vá para Configurações de conexão> Propriedades do driver> Fuso horário do servidor> Definir UTC.
Além disso, na configuração de inicialização da primavera, teve que definir a propriedade abaixo.
jdbc: mysql: // localhost: /? serverTimezone = UTC
fonte
Aparentemente, para que a versão 5.1.33 do driver JDBC do MySQL funcione com o fuso horário UTC, é necessário especificar explicitamente o serverTimezone na cadeia de conexão.
fonte
Eu também estava tendo exatamente o mesmo problema no LibreOffice Base. Então, acabei de especificar um 'fuso horário de verão' na string de conexão.
Eu tentei sem o "& serverTimezone = MST", mas isso também falhou.
Eu também tentei "& serverTimezone = MDT" e isso falhou, então, por algum motivo, ele não gosta do horário de verão!
fonte
Eu tive o mesmo problema ao tentar trabalhar com o projeto de inicialização por mola no Windows.
O URL da fonte de dados deve ser:
spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
fonte
Execute a consulta abaixo no banco de dados mysql para resolver o erro
fonte
Tenho um erro semelhante ao seu, mas o meu O valor do fuso horário do servidor é 'Afr. centrale Ouest ', então eu executei estas etapas:
MyError (no IntelliJ IDEA Community Edition):
Eu enfrentei esse problema quando atualizei meu servidor mysql para o SQL Server 8.0 (MYSQL80).
A solução mais simples para esse problema é simplesmente escrever o comando abaixo no seu MYSQL Workbench -
O valor após o fuso horário será igual a GMT +/- Diferença no seu fuso horário. O exemplo acima é para o norte da África (GMT + 1: 00) / ou para a Índia (GMT + 5: 30). Isso resolverá o problema.
Digite o seguinte código no seu Mysql Workbench e execute o quesry
[link da fonte para a pergunta / problema]
[link da fonte para a resposta]
[Solução ScreenShot]
fonte
Esta é realmente a solução para esse problema, mas não copie e cole no seu programa. Se você acabou de ler a linha, encontrará 'resultout', esse é o nome do meu banco de dados e você deverá escrever o seu.
Existem três componentes de cadeia, o primeiro é o URL, o segundo é o nome de usuário e o terceiro é a senha. No parágrafo acima, limpamos, url. O segundo e o terceiro componentes String, como disse seu nome de usuário e senha, devem ser alterados de acordo.
obrigado
fonte
Resolvi esse problema sem nenhuma alteração de código único. basta ir para a configuração da hora do sistema e definir o fuso horário. No meu caso, o fuso horário padrão era UTC, que mudei para meu fuso horário local. Depois de reiniciar todos os serviços, tudo funcionou para mim.
fonte
Estou atrasado, mas se você estiver enfrentando o seguinte erro e usando a fonte de dados (javax.sql.DataSource):
Defina a seguinte linha para se livrar do erro:
fonte
No meu caso, era um ambiente de teste e eu tive que fazer um aplicativo existente funcionar sem nenhuma alteração na configuração e, se possível, sem nenhuma alteração na configuração do MySQL. Consegui corrigir o problema seguindo a sugestão @vinnyjames e alterando o fuso horário do servidor para UTC :
Fazer isso foi suficiente para eu resolver o problema.
fonte
Eu adicionei a seguinte linha ao meu
/etc/mysql/my.cnf
arquivo:Reiniciou o servidor MySQL:
E funciona como um encanto.
fonte
Não há impacto em definir a hora do servidor como UTC (por exemplo, com
jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC
, mesmo que os servidores de aplicativos / banco de dados não estejam nesse fuso horário. O importante é que a cadeia de conexão do aplicativo + o banco de dados seja sincronizada com o mesmo fuso horário.Em outras palavras, a simples configuração
serverTimezone=UTC
com um fuso horário diferente no servidor de banco de dados mudará as datas extraídas do banco de dadosfonte
Concorde com a resposta @bluecollarcoder, mas é melhor usar
TimeZone.getDefault().getID();
no final da cadeia de conexão:Nesse caso, o
Timezone
parâmetro é atualizado automaticamente, dependendo do fuso horário da máquina local.fonte
Apenas modifique a cadeia de conexão com o seguinte código no arquivo application.properties.
fonte