PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Servidores geograficamente dispersos, PostgreSQL e JPA


A solução é usar os campos TIMESTAMPTZ para esses instantes no tempo. Algo como "quando o usuário foi criado" nunca deve ser armazenado com um campo TIMESTAMP, pois por padrão ele não contém informações de TZ. O driver JDBC lida com isso de forma bastante arbitrária. Por exemplo, considere o seguinte:

Suponha que sua JVM esteja na zona America/Los_Angeles enquanto seu servidor de banco de dados estiver em UTC.

Em seguida, crie a seguinte tabela:
 CREATE TABLE test (
   id   INTEGER,
   ts   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
 );

Se você emitir do PSQL:
 INSERT INTO test(id) values(1);

Você obterá valores idênticos para "ts" e "tswz". Ambos serão a hora UTC atual. No entanto, se você executar a consulta SAME EXACT do Java usando o driver JDBC, "ts" será a hora atual em Los Angeles e "tswz" será a hora UTC.

Não sei COMO o driver transmite ao servidor o fuso horário da JVM neste caso porque estamos padronizando o campo no servidor. Eles dizem que não definem o fuso horário para a sessão, mas devem. De qualquer forma, se você usar um campo TIMESTAMPTZ, obterá os mesmos instantes de qualquer JVM, independentemente do fuso horário em que esteja.