--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.
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.
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 ...?
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