[JAVA] Eine kleine süchtig machende Geschichte nach dem Update des JDBC-Treibers für PostgreSQL

Hintergrund

--Spring Boot 1.5-Anwendung

Der JDBC-Treiber von PostgreSQL erstellt INSERT-Anweisungen für die Anzahl der Datensätze, auch wenn mehrere Zeilen mit "batchUpdate ()" eingefügt werden. Das ist langsam, also möchte ich BULK INSERT für Geschwindigkeit.

Eine Option namens "reWriteBatchedInserts" wurde vom Treiber "9.4.1209" hinzugefügt. Wenn Sie diese Option festlegen, wird sie zu BULK INSERT. Es gibt jedoch ein Problem, dass bei Verwendung von "INSERT ON CONFLICT" ungültiges SQL generiert wird. Dies wurde in 42.2.2 behoben. Es ist jedoch "9.4.1212", das in der Spring Boot 1.5-Serie eingeführt wird. .. ..

Also habe ich beschlossen, die Treiberversion zu aktualisieren.

Ich habe versucht, ein Upgrade durchzuführen

Fügen Sie Folgendes zu pom.xml hinzu, um das neueste 42.2.4 zu installieren.

pom.xml


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

Nur das. Es ist einfach.

Jedoch.

Der Test warf beim Erstellen einen Fehler auf.

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

Wenn Sie die Treiberversion zurücksetzen, verschwindet der Fehler, sodass sicher ist, dass dies die Auswirkung des Versions-Upgrades ist.

Umfrage

Der Grund, warum der Test fehlschlägt, ist, dass der Zeitstempel nach oben verschoben wurde. Um zu überprüfen, welche Lese- und Schreibvorgänge das Problem verursachen, habe ich die DB-Daten untersucht, ohne diesen Treiber durchzugehen, und festgestellt, dass der übertragene Datensatz registriert wurde. Es scheint also, dass er beim Schreiben bereits ungültig ist. Es scheint, dass die Daten sind.

Wieso ist es so.

Als ich dies und das gegoogelt habe, habe ich ein bestimmtes [Problem] gefunden (https://github.com/pgjdbc/pgjdbc/issues/1211). Demnach handelt es sich um ein Problem, das in Version 42.1.1 oder höher auftritt und in Version 42.2.3 behoben wurde. Das? Dann wurde das Problem behoben ...?

Lösung

Dieses Problem ist ein Kick, und in Version 42.1.1 und höher werden die Nanosekunden von java.sql.Timestamp bei der Konvertierung in DB Timestamp abgerundet. Dies entspricht einer Genauigkeit von bis zu Mikrosekunden. Es stellt sich heraus, dass frühere Versionen Nanosekunden ignorierten.

Also, wenn ich die Konfiguration zum Testen überprüfe ...

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

Ich habe bis zu Nanosekunden aufgefüllt!

Also habe ich es gelöst, indem ich "99999999999" in "999999000" geändert habe.

Recommended Posts

Eine kleine süchtig machende Geschichte nach dem Update des JDBC-Treibers für PostgreSQL
Laden Sie den JDBC-Treiber nach dem Erstellen herunter
Eine kleine Geschichte mit regulären Ausdrücken Teil 1
So erstellen Sie einen JDBC-Treiber
Eine kleine Geschichte über reguläre Ausdrücke Teil 2
Eine kleine unruhige Geschichte mit Groovy