sql >> Databasteknik >  >> RDS >> PostgreSQL

Geografiskt spridda servrar, PostgreSQL och JPA

Lösningen är att använda TIMESTAMPTZ-fält för dessa ögonblick i tid. Något som "när skapades användaren" bör aldrig lagras med ett TIMESTAMP-fält eftersom det som standard inte innehåller TZ-information. JDBC-drivrutinen hanterar dessa ganska godtyckligt. Tänk till exempel på följande:

Anta att din JVM är i America/Los_Angeles-zonen medan din databasserver är i UTC.

Skapa sedan följande tabell:

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

Om du utfärdar från PSQL:

 INSERT INTO test(id) values(1);

Du kommer att få identiska värden för "ts" och "tswz". Båda kommer att vara aktuell UTC-tid. Men om du utför SAMMA EXAKT fråga från Java med JDBC-drivrutinen kommer "ts" att vara den aktuella tiden i Los Angeles och "tswz" kommer att vara UTC-tiden.

Jag vet inte HUR drivrutinen förmedlar JVM-tidszonen till servern i det här fallet eftersom vi förinställer fältet på servern. De säger att de inte ställer in tidszonen för sessionen, men de måste. Hur som helst, om du använder ett TIMESTAMPTZ-fält kommer du att få samma ögonblick från alla JVM oavsett vilken tidszon den råkar vara i.




  1. Lagrad procedur i Oracle-exempel med IN OUT-parameter

  2. räkna topp 10 mest förekommande värden i en kolumn i mysql

  3. Fillagring för webbapplikationer:Filsystem vs DB vs NoSQL-motorer

  4. vad är och hur tar jag bort tabellutrymmesfel från min databas?