Consultando Dados em vários Fusos Horários

Em um cenário distribuído, consultas são realmente executadas em servidores. Ao consultar dados com predicados do tipo calendar, java.util.Date e timestamp, o valor de data / hora especificado em uma consulta é baseado no fuso horário local do servidor.

Em um sistema de fuso horário único no qual todos os clientes e servidores são executados no mesmo fuso horário, você não precisa considerar os problemas relacionados aos tipos de predicado com calendar, java.util.Date e timestamp. Entretanto, quando clientes e servidores estão em fusos horários diferentes, o valor de data / hora especificado nas consultas é baseado no fuso horário do servidor e pode retornar dados indesejados para o cliente. Sem saber o fuso horário do servidor, o valor de data / hora especificado não tem sentido. Portanto, o valor de data / hora especificado deve considerar a diferença do deslocamento de fuso horário entre o fuso horário de destino e o fuso horário do servidor.

Deslocamento de Fuso Horário

Por exemplo, suponha que um cliente esteja em um fuso horário [GMT-0] e que o servidor esteja em um fuso horário [GMT-6]. O fuso horário do servidor está 6 horas atrás do cliente. O cliente gostaria de executar a seguinte consulta:

SELECT e FROM Employee
e WHERE e.birthDate='1999-12-31 06:00:00'

Supondo que a entidade Employee tenha um atributo birthDate do tipo java.util.Date, o cliente está no fuso horário [GMT-0] e quer recuperar Employees com o valor de birthDate de '1999-12-31 06:00:00 [GMT-0]' com base em seu fuso horário.

A consulta será executada no servidor e o valor de birthDate utilizado pelo mecanismo de consulta será '1999-12-31 06:00:00 [GMT-6]', que é igual a '1999-12-31 12:00:00 [GMT-0]'. Employees com valor de birthDate igual a '1999-12-31 12:00:00 [GMT-0]' serão retornados ao cliente. Além disso, o cliente não obterá Employees desejados com valor de birthDate de '1999-12-31 06:00:00 [GMT-0]'.

O problema descrito ocorre devido à diferença de fuso horário entre cliente e servidor. Para resolver esse problema, uma abordagem é calcular o deslocamento de fuso horário entre cliente e servidor e aplicar esse deslocamento no valor de data / hora de destino na consulta. No exemplo de consulta anterior, o deslocamento de fuso horário é de -6 horas, e o predicado birthDate ajustado deve ser “birthDate='1999-12-31 00:00:00'” se o cliente pretende recuperar Employees com valor de birthDate de '12-31 06:00:00 [GMT-0]'. Com o valor de birthDate ajustado, o servidor utilizará '1999-12-31 00:00:00 [GMT-6]' que é igual ao valor de destino '12-31 06:00:00 [GMT-0]', e Employees necessários serão retornados ao cliente.

Implementação Distribuída em vários Fusos Horários

Se a grade do eXtreme Scale distribuída for implementada em vários servidores ObjectGrid em vários fusos horários, a abordagem de ajuste do deslocamento de fuso horário não funcionará porque o cliente não saberá qual servidor executará a consulta e, assim, não poderá determinar o deslocamento de fuso horário a ser utilizado. A única solução é utilizar o sufixo ‘Z' (sem distinção de maiúsculas e minúsculas) no formato de escape de data e hora do JDBC para indicar o uso do fuso horário GMT com base no valor de data e hora. O sufixo ‘Z' (sem distinção de maiúsculas e minúsculas) indica o uso do fuso horário GMT com base no valor de data e hora. Sem o sufixo ‘Z', o valor de data e hora baseado no fuso horário local será utilizado no processo que executa a consulta.

A consulta a seguir é equivalente ao exemplo anterior, mas utiliza o sufixo ‘Z':

SELECT e FROM Employee e WHERE e.birthDate='1999-12-31 06:00:00Z'

A consulta deve localizar Employees com valor de birthDate de ‘1999-12-31 06:00:00'. O sufixo ‘Z' indica que o valor de birthDate especificado é baseado no fuso horário GMT, portanto, o valor de birthDate ‘1999-12-31 06:00:00 [GMT-0]' baseado no fuso horário GMT será utilizado pelo mecanismo de consulta para o valor do critério de correspondência. Employees com valor de atributo birthDate igual a esse valor de birthDate baseado em GMT ‘1999-12-31 06:00:00 [GMT-0]' serão incluídos no resultado da consulta. O uso do sufixo ‘Z' no formato de escape de data e hora do JDBC em qualquer consulta é crucial para tornar o fuso horário dos aplicativos seguro. Sem essa abordagem, o valor de data e hora é baseado no fuso horário do servidor e não tem sentido a partir da perspectiva do cliente quando clientes e servidores estão em fusos horários diferentes.

Para obter informações adicionais, consulte Dados para Diferentes Fusos Horários.