PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Geografisch verteilte Server, PostgreSQL und JPA

Die Lösung besteht darin, TIMESTAMPTZ-Felder für diese Zeitpunkte zu verwenden. Etwas wie „Wann wurde der Benutzer erstellt“ sollte niemals mit einem TIMESTAMP-Feld gespeichert werden, da es standardmäßig keine TZ-Informationen enthält. Der JDBC-Treiber behandelt diese recht willkürlich. Betrachten Sie beispielsweise Folgendes:

Angenommen, Ihre JVM befindet sich in der Zone America/Los_Angeles, während sich Ihr Datenbankserver in UTC befindet.

Erstellen Sie dann die folgende Tabelle:

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

Wenn Sie von PSQL ausgeben:

 INSERT INTO test(id) values(1);

Sie erhalten identische Werte für „ts“ und „tswz“. Beides ist die aktuelle UTC-Zeit. Wenn Sie jedoch die SAME EXACT-Abfrage von Java mit dem JDBC-Treiber ausführen, ist „ts“ die aktuelle Zeit in Los Angeles und „tswz“ die UTC-Zeit.

Ich weiß nicht, WIE der Treiber in diesem Fall die JVM-Zeitzone an den Server übermittelt, da wir das Feld auf dem Server standardmäßig festlegen. Sie sagen, dass sie die Zeitzone für die Sitzung nicht festlegen, aber sie müssen. Wie auch immer, wenn Sie ein TIMESTAMPTZ-Feld verwenden, erhalten Sie von jeder JVM dieselben Augenblicke, unabhängig davon, in welcher Zeitzone sie sich gerade befindet.