[JAVA] Une petite histoire addictive après la mise à jour du pilote JDBC pour PostgreSQL

Contexte

Le pilote JDBC de PostgreSQL crée des instructions INSERT pour le nombre d'enregistrements même si plusieurs lignes sont INSERT avec batchUpdate (). C'est lent, donc je veux BULK INSERT pour la vitesse.

Une option appelée reWriteBatchedInserts a été ajoutée à partir du pilote 9.4.1209, et en définissant ceci, elle devient BULK INSERT, mais il y a un problème que SQL invalide est généré lors de l'utilisation de ʻINSERT ON CONFLICT`. , Ceci a été résolu dans «42.2.2». Cependant, c'est «9.4.1212» qui est introduit dans la série Spring Boot 1.5. .. ..

J'ai donc décidé de mettre à jour la version du pilote.

J'ai essayé de mettre à jour

Ajoutez ce qui suit à pom.xml pour installer la dernière 42.2.4.

pom.xml


  <properties>
    ...
    <postgresql.version>42.2.4</postgresql.version>
    ...
  </properties>

Seulement ça. C'est facile.

Pourtant.

Le test a généré une erreur lors de la construction.

Expected :2015-12-15 23:30:59.999999
Actual   :2015-12-15 23:31:00.0

Si vous rétablissez la version du pilote, l'erreur disparaît, il est donc certain que c'est l'effet de la mise à niveau de la version.

Enquête

La raison pour laquelle le test échoue est que l'horodatage a été remonté. Afin de vérifier lequel de Read et Write est à l'origine du problème, j'ai regardé dans les données de la base de données sans passer par ce pilote, et j'ai trouvé que l'enregistrement reporté était enregistré, il semble donc qu'il est déjà invalide lors de l'écriture. Il semble que les données le soient.

Pourquoi en est-il ainsi.

Quand j'ai recherché ceci et cela sur Google, j'ai trouvé un certain problème. Selon cela, il s'agit d'un problème qui se produit dans la version «42.1.1» ou ultérieure et qui a été corrigé dans «42.2.3». cette? Ensuite, le problème a été résolu ...?

Solution

Ce problème est un coup de pied, et dans la version 42.1.1 ou ultérieure, lors de la conversion de nano secondes de java.sql.Timestamp en horodatage de la base de données qui est une précision allant jusqu'à quelques microsecondes, il est arrondi. Il s'avère que les versions antérieures ignoraient les nanosecondes.

Donc, quand je vérifie la configuration pour tester ...

public Clock clock() {
    return Clock.fixed(ZonedDateTime.of(2015, 12, 15, 23, 30, 59, 999999999, ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault());
}

J'ai rempli jusqu'à nano secondes!

Donc, je l'ai résolu en changeant «99999999999» en «999999000».

Recommended Posts

Une petite histoire addictive après la mise à jour du pilote JDBC pour PostgreSQL
Téléchargez le pilote JDBC après la construction
Une petite histoire d'expression régulière Partie 1
Comment créer un pilote JDBC
Une petite histoire d'expressions régulières Partie 2
Une petite histoire troublée avec Groovy