PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Server geograficamente dispersi, PostgreSQL e JPA

La soluzione è utilizzare i campi TIMESTAMPTZ per questi istanti di tempo. Qualcosa come "quando è stato creato l'utente" non dovrebbe mai essere memorizzato con un campo TIMESTAMP poiché per impostazione predefinita non contiene informazioni TZ. Il driver JDBC li gestisce in modo abbastanza arbitrario. Ad esempio, considera quanto segue:

Supponiamo che la tua JVM sia nella zona America/Los_Angeles mentre il tuo server di database è in UTC.

Quindi crea la seguente tabella:

 CREATE TABLE test (
   id   INTEGER,
   ts   TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   tswz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
 );

Se emetti da PSQL:

 INSERT INTO test(id) values(1);

Otterrai valori identici per "ts" e "tswz". Entrambi saranno l'ora UTC corrente. Tuttavia, se si esegue la query SAME EXACT da Java utilizzando il driver JDBC, "ts" sarà l'ora corrente a Los Angeles e "tswz" sarà l'ora UTC.

Non so COME il driver trasmetta al server il fuso orario della JVM in questo caso perché stiamo impostando il campo sul server di default. Dicono che non impostano il fuso orario per la sessione, ma devono farlo. Ad ogni modo, se utilizzi un campo TIMESTAMPTZ, otterrai gli stessi istanti da qualsiasi JVM indipendentemente dal fuso orario in cui si trova.