ERRORCODE = -4471 se produit dans une application Java qui utilise Db2.

environnement

Les principales versions de logiciel utilisées dans la rédaction de cet article sont les suivantes.

un événement

Le code ci-dessous récupère tous les ʻEMPNO d'une table appelée ʻEMP et les renvoie vers la sortie standard.

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();
        }
    }
}

Lorsque je compile et exécute ce code source, j'obtiens l'exception suivante après avoir imprimé tous les ʻEMPNO` sur la sortie standard:

com.ibm.db2.jcc.am.SqlException: [jcc][t4][10251][10308][4.26.14]Java pendant qu'une transaction est en cours sur la connexion.sql.Connection.close()A été demandé.
La transaction reste active et la connexion ne peut pas être fermée. CODE D'ERREUR=-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 () peut être compris car try-catch-with-resource l'appelle sans permission, mais en premier lieu, "La transaction reste active et la connexion ne peut pas être fermée." Quel bordel ??? __.

Cause

Db2 nécessite que la transaction soit finalisée avec «COMMIT» ou «ROLLBACK» avant de fermer la connexion à la base de données. «COMMIT» et «ROLLBACK» ne sont effectués que lorsque des modifications sont apportées aux données de la base de données, telles que «INSERT» et «DELETE», et «COMMIT» et «ROLLBACK» sont exécutées pour «SELECT» qui se réfère uniquement aux données. Je suis sûr qu'il y a beaucoup de gens qui ne font pas attention, mais au moins dans Db2, vous devez être conscient des transactions, même dans le cas de SELECT.

Dans le code source ci-dessus, l'autocommit a été désactivé (con.setAutoCommit (false)). Si auto-commit = true, le pilote jdbc s'engage automatiquement lorsque vous appelez Connection :: close, mais si auto-commit = false, le programmeur va explicitement Connection :: commit ou. Si vous n'appelez pas Connection :: rollback, la transaction ne sera pas finalisée. En d'autres termes, dans le code source ci-dessus, nous avons désactivé l'auto-commit, nous avons donc essayé de fermer la connexion sans confirmer la transaction, ce qui a abouti à ʻERRORCODE = -4471`.

Contre-mesures

--Call Connection :: commit ou Connection :: rollback pour terminer explicitement la transaction --Définissez auto-commit = true et lancez l'achèvement de la transaction au pilote JDBC.

Est-ce la contre-mesure (´ ・ ω ・ `)

Recommended Posts

ERRORCODE = -4471 se produit dans une application Java qui utilise Db2.
Essayez d'utiliser RocksDB avec Java
Exécuter des applications Java dans Azure Batch
Chiffrer à l'aide du chiffrement RSA en Java
Connexion HTTPS utilisant tls1.2 dans Java 6
J'ai essayé d'utiliser JWT en Java
[Java] Obtenir des données de la base de données à l’aide du service singleton dans Spring (Boot)
Déployer automatiquement des applications Web développées en Java à l’aide de Jenkins [Préparation]
Déployer automatiquement des applications Web développées en Java à l'aide de Jenkins [Tomcat App Edition]
Essayez d'utiliser le framework Java Nablarch [Application Web]
J'ai essayé d'utiliser l'API Elasticsearch en Java
Mapper sans utiliser de tableau en java
Essayez d'utiliser l'API au format JSON en Java
Générer de la documentation DB à l'aide de SchemaSpy dans Gradle
Lire Felica en utilisant RC-S380 (PaSoRi) en Java
Surveillance de l'état des applications Java à l'aide d'Elasticsearch
Rôle de JSP dans les applications Web [Java]
Environnement de développement d'applications Java créé dans un environnement VM
Déployer automatiquement des applications Web développées en Java à l'aide de Jenkins [Spring Boot App Edition]
J'ai essayé de créer une application de conversation en Java à l'aide de l'IA «A3RT»
À propos du phénomène que StackOverflowError se produit lors du traitement à l'aide d'expressions régulières Java
Créer une fonction d'authentification dans l'application Rails à l'aide de devise
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Partition en Java
[Java] Création d'API à l'aide de Jerjey (Jax-rs) avec eclipse
État de l'application Java 9+
Envoyer des e-mails à l'aide d'Amazon SES SMTP en Java
Envoyer des notifications push à l'aide de Notification Hubs en Java
Changements dans Java 11
[Java] Convertit le code DB en valeur de code à l'aide d'énum
Essayez d'utiliser Sourcetrail (version win) avec du code Java
Janken à Java
Essayez d'utiliser l'API Cloud Vision de GCP en Java
Essayez d'utiliser Sourcetrail (version macOS) avec du code Java
Faire correspondre les adresses IP à l'aide d'expressions régulières en Java
Afficher "Hello World" dans le navigateur à l'aide de Java
Afficher "Hello World" dans le navigateur à l'aide de Java
Taux circonférentiel à Java
Essayez d'utiliser l'analyse syntaxique de l'API COTOHA en Java
NLP4J [001b] Analyse morphologique en Java (utilisant kuromoji)
Lors de l'utilisation d'une liste en Java, java.awt.List sort et une erreur se produit
FizzBuzz en Java
Convertir JSON et YAML en Java (en utilisant Jackson et SnakeYAML)
Tout supprimer du SDK Java dans Azure CosmosDB
[Java] explique ConcurrentModificationException qui se produit dans java.util.ArrayList pour les nouveaux arrivants
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
J'ai essayé d'utiliser l'instruction Extended for en Java
Essayez le hooking global en Java à l'aide de la bibliothèque JNativeHook
twitter4j java Stocke les tweets recherchés dans DB (MySQL).
Différences de code lors de l'utilisation du système de longueur en Java
Lire JSON en Java
Tri à l'aide du comparateur java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
Méthode de connexion JAVA DB