ERRORCODE = -4471 tritt in einer Java-Anwendung auf, die Db2 verwendet.

Umgebung

Die wichtigsten Softwareversionen, die beim Schreiben dieses Artikels verwendet werden, sind folgende.

Veranstaltung

Der folgende Code ruft alle EMPNOs aus einer Tabelle namens EMPs ab und gibt sie an die Standardausgabe aus.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        String url = "jdbc:db2://<hostname>:<port>/<dbname>";
        String user = "<user>";
        String password = "<password>";

        try (Connection con = DriverManager.getConnection(url, user, password)) {
            con.setAutoCommit(false);

            PreparedStatement ps = con.prepareStatement("SELECT * FROM EMP");
            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getString("EMPNO"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Wenn ich diesen Quellcode kompiliere und ausführe, erhalte ich die folgende Ausnahme, nachdem ich alle EMPNOs in der Standardausgabe gedruckt habe:

com.ibm.db2.jcc.am.SqlException: [jcc][t4][10251][10308][4.26.14]Java, während eine Transaktion für die Verbindung ausgeführt wird.sql.Connection.close()Wurde ersucht.
Die Transaktion bleibt aktiv und die Verbindung kann nicht geschlossen werden. FEHLERCODE=-4471, SQLSTATE=null
	at com.ibm.db2.jcc.am.b7.a(b7.java:794)
	at com.ibm.db2.jcc.am.b7.a(b7.java:66)
	at com.ibm.db2.jcc.am.b7.a(b7.java:133)
	at com.ibm.db2.jcc.am.Connection.checkForTransactionInProgress(Connection.java:1484)
	at com.ibm.db2.jcc.t4.b.checkForTransactionInProgress(b.java:7581)
	at com.ibm.db2.jcc.am.Connection.closeResourcesX(Connection.java:1507)
	at com.ibm.db2.jcc.am.Connection.closeX(Connection.java:1493)
	at com.ibm.db2.jcc.am.Connection.close(Connection.java:1470)
	at Main.main(Main.java:22)

__java.sql.Connection.close () kann verstanden werden, weil try-catch-with-resource es ohne Erlaubnis aufruft, aber zunächst "Die Transaktion bleibt aktiv und die Verbindung kann nicht geschlossen werden." Was für ein Chaos ??? __.

Ursache

Für Db2 muss die Transaktion mit "COMMIT" oder "ROLLBACK" abgeschlossen werden, bevor die DB-Verbindung geschlossen wird. "COMMIT" und "ROLLBACK" werden nur ausgeführt, wenn Änderungen an den Daten in der Datenbank vorgenommen werden, wie "INSERT" und "DELETE", und "COMMIT" und "ROLLBACK" werden für "SELECT" verwendet, das sich nur auf die Daten bezieht. Ich bin mir sicher, dass es viele Leute gibt, die nicht darauf achten, aber zumindest in Db2 müssen Sie sich der Transaktionen bewusst sein, selbst im Fall von "SELECT".

Im obigen Quellcode wurde Autocommit deaktiviert (con.setAutoCommit (false)). Wenn auto-commit = true ist, führt der Aufruf von "Connection :: close" dazu, dass der jdbc-Treiber automatisch festgeschrieben wird. Wenn auto-commit = false, wird der Programmierer explizit "Connection :: commit" oder ". Wenn Sie Connection :: rollback` nicht aufrufen, wird die Transaktion nicht abgeschlossen. Mit anderen Worten, im obigen Quellcode haben wir die automatische Festschreibung deaktiviert und versucht, die Verbindung zu schließen, ohne die Transaktion zu bestätigen, was zu "ERRORCODE = -4471" führte.

Gegenmaßnahmen

Ist das die Gegenmaßnahme (´ ・ ω ・ `)

Recommended Posts

ERRORCODE = -4471 tritt in einer Java-Anwendung auf, die Db2 verwendet.
Versuchen Sie es mit RocksDB mit Java
Führen Sie Java-Anwendungen in Azure Batch aus
Verschlüsselung mit RSA-Verschlüsselung in Java
HTTPS-Verbindung mit tls1.2 in Java 6
Ich habe versucht, JWT in Java zu verwenden
[Java] Abrufen von Daten aus der Datenbank mithilfe des Singleton-Dienstes in Spring (Boot)
Automatische Bereitstellung von in Java entwickelten Webanwendungen mit Jenkins [Vorbereitung]
Automatische Bereitstellung von in Java entwickelten Webanwendungen mit Jenkins [Tomcat App Edition]
Versuchen Sie es mit dem Java Framework Nablarch [Web Application]
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Map ohne Verwendung eines Arrays in Java
Versuchen Sie es mit der JSON-Format-API in Java
Generieren Sie die DB-Dokumentation mit SchemaSpy in Gradle
Lesen Sie Felica mit RC-S380 (PaSoRi) in Java
Statusüberwachung von Java-Apps mit Elasticsearch
Rolle von JSP in Webanwendungen [Java]
In einer VM-Umgebung erstellte Java-Anwendungsentwicklungsumgebung
Automatische Bereitstellung von in Java entwickelten Webanwendungen mit Jenkins [Spring Boot App Edition]
Ich habe versucht, mit AI "A3RT" eine Talk-App in Java zu erstellen.
Über das Phänomen, dass StackOverflowError bei der Verarbeitung mit regulären Java-Ausdrücken auftritt
Erstellen Sie die Authentifizierungsfunktion in der Rails-Anwendung mit devise
ChatWork4j für die Verwendung der ChatWork-API in Java
Partisierung in Java
[Java] API-Erstellung mit Jerjey (Jax-rs) mit Eclipse
Java 9+ Anwendungsstatus
Senden Sie E-Mails mit Amazon SES SMTP in Java
Senden Sie Push-Benachrichtigungen über Notification Hubs in Java
Änderungen in Java 11
[Java] Konvertieren Sie DB-Code mit enum in einen Codewert
Versuchen Sie es mit Sourcetrail (Win-Version) mit Java-Code
Janken in Java
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Versuchen Sie es mit Sourcetrail (MacOS-Version) mit Java-Code
Passen Sie IP-Adressen mithilfe regulärer Ausdrücke in Java an
Zeigen Sie "Hello World" im Browser mit Java an
Zeigen Sie "Hello World" im Browser mit Java an
Umfangsrate in Java
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
NLP4J Morphologische Analyse in Java (unter Verwendung von Kuromoji)
Bei Verwendung einer Liste in Java wird java.awt.List ausgegeben und ein Fehler tritt auf
FizzBuzz in Java
Konvertieren Sie JSON und YAML in Java (mit Jackson und SnakeYAML)
Löschen Sie alle aus dem Java SDK in Azure CosmosDB
[Java] Erläutert die ConcurrentModificationException, die in java.util.ArrayList für Neulinge auftritt
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Ich habe versucht, die erweiterte for-Anweisung in Java zu verwenden
Versuchen Sie es mit globalem Hooking in Java mithilfe der JNativeHook-Bibliothek
twitter4j java Speichern Sie die gesuchten Tweets in DB (MySQL).
Unterschiede im Code bei Verwendung des Längensystems in Java
Lesen Sie JSON in Java
Sortieren mit Java-Komparator
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
JAVA DB-Verbindungsmethode