PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Serveurs géographiquement dispersés, PostgreSQL et JPA

La solution consiste à utiliser les champs TIMESTAMPTZ pour ces instants dans le temps. Quelque chose comme "quand l'utilisateur a-t-il été créé" ne doit-il jamais être stocké avec un champ TIMESTAMP car, par défaut, il ne contient pas d'informations TZ. Le pilote JDBC les gère de manière assez arbitraire. Par exemple, considérez ce qui suit :

Supposons que votre JVM se trouve dans la zone America/Los_Angeles alors que votre serveur de base de données est en UTC.

Créez ensuite le tableau suivant :

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

Si vous émettez depuis PSQL :

 INSERT INTO test(id) values(1);

Vous obtiendrez des valeurs identiques pour "ts" et "tswz". Les deux seront l'heure UTC actuelle. Cependant, si vous effectuez la requête SAME EXACT à partir de Java à l'aide du pilote JDBC, "ts" sera l'heure actuelle à Los Angeles et "tswz" sera l'heure UTC.

Je ne sais pas COMMENT le pilote transmet au serveur le fuseau horaire de la JVM dans ce cas, car nous définissons par défaut le champ sur le serveur. Ils disent qu'ils ne définissent pas le fuseau horaire de la session, mais qu'ils le doivent. Quoi qu'il en soit, si vous utilisez un champ TIMESTAMPTZ, vous obtiendrez les mêmes instants de n'importe quelle JVM, quel que soit le fuseau horaire dans lequel elle se trouve.