Maison > Java > javaDidacticiel > Comment résoudre : Erreur de base de données Java : exception du pool de connexions

Comment résoudre : Erreur de base de données Java : exception du pool de connexions

WBOY
Libérer: 2023-08-18 13:09:16
original
1009 Les gens l'ont consulté

Comment résoudre : Erreur de base de données Java : exception du pool de connexions

Comment résoudre : Erreur de base de données Java : exception du pool de connexions

Introduction :
Lorsque vous utilisez Java pour les opérations de base de données, vous rencontrez souvent le problème de l'exception du pool de connexions. Le pooling de connexions est une technologie conçue pour améliorer l'efficacité des opérations de base de données. Il peut réutiliser les connexions de base de données établies et éviter la création et la destruction fréquentes de connexions. Cependant, lorsqu'une exception se produit dans le pool de connexions, la connexion ne peut pas être obtenue ou libérée, ce qui entraîne des problèmes de fonctionnement de la base de données. Cet article présentera certaines exceptions courantes du pool de connexions et fournira des solutions et des exemples de code associés.

Exception de délai d'expiration de connexion : 
L'exception de délai d'expiration de connexion est principalement due au fait que la connexion dans le pool de connexions est occupée pendant trop longtemps et ne peut pas être libérée, ce qui fait que toutes les connexions du pool de connexions sont pleines et ne peuvent pas obtenir les connexions disponibles. La façon de résoudre ce problème consiste à définir le délai d'expiration de la connexion dans le code et à libérer la connexion à temps. Voici un exemple de code utilisant le pool de connexions Druid :

import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ConnectionPoolExample {
    private static DruidDataSource dataSource;

    static {
        dataSource = new DruidDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        dataSource.setMaxActive(100);
        dataSource.setInitialSize(10);
        dataSource.setMinIdle(5);
        dataSource.setMaxWait(5000);
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;

        try {
            conn = getConnection();
            stmt = conn.prepareStatement("SELECT * FROM user");
            rs = stmt.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getString("username"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close(); // 释放连接
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
Copier après la connexion

Dans le code ci-dessus, nous limitons le nombre maximum de connexions dans le pool de connexions en définissant setMaxActive et en définissant setMaxWait à Définit le temps d'attente maximum pour une connexion. Lorsque les connexions du pool de connexions sont pleines et que le temps d'attente dépasse le temps défini, une exception d'expiration de connexion est levée. Nous libérons la connexion en appelant la méthode conn.close() dans le bloc final pour garantir que la connexion puisse être recyclée à temps. setMaxActive来限制连接池中的最大连接数,设置setMaxWait来定义连接的最大等待时间。当连接池中的连接被占满且等待时间超过设定的时间时,就会抛出连接超时异常。我们通过在finally块中调用conn.close()方法来释放连接,保证连接能够被及时回收。

连接泄漏异常:
连接泄漏异常是由于在代码中没有正确释放连接而导致连接池中的连接数量不断增加,最终耗尽连接池的资源,无法再创建新的连接。解决这个问题的方法是确保在每次使用连接之后,都要及时关闭连接。下面是一个使用C3P0连接池的示例代码:

import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ConnectionPoolExample2 {
    private static ComboPooledDataSource dataSource;

    static {
        dataSource = new ComboPooledDataSource();
        dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUser("root");
        dataSource.setPassword("password");
        dataSource.setMaxPoolSize(100);
        dataSource.setInitialPoolSize(10);
        dataSource.setMinPoolSize(5);
        dataSource.setMaxIdleTime(60);
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;

        try {
            conn = getConnection();
            stmt = conn.prepareStatement("SELECT * FROM user");
            rs = stmt.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getString("username"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close(); // 释放连接
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
Copier après la connexion

在上面的代码中,我们可以通过设置setMaxPoolSize来限制连接池中的最大连接数,setMaxIdleTime来定义连接的最大空闲时间。当连接池中的连接空闲时间超过设定的时间时,就会抛出连接泄漏异常。通过在finally块中调用conn.close()

Exception de fuite de connexion :

L'exception de fuite de connexion est due à l'échec de la libération correcte de la connexion dans le code, ce qui entraîne une augmentation continue du nombre de connexions dans le pool de connexions, finissant par épuiser les ressources du pool de connexions et non plus être capable de créer de nouvelles connexions. La façon de résoudre ce problème est de garantir que la connexion est fermée rapidement après chaque utilisation. Voici un exemple de code utilisant le pool de connexions C3P0 :
rrreee

Dans le code ci-dessus, nous pouvons limiter le nombre maximum de connexions dans le pool de connexions en définissant setMaxPoolSize, setMaxIdleTime pour définir le temps d'inactivité maximum de la connexion. Lorsque le temps d'inactivité de la connexion dans le pool de connexions dépasse le temps défini, une exception de fuite de connexion est levée. En appelant la méthode conn.close() dans le bloc final pour libérer la connexion, le problème de fuite de connexion peut être évité. 🎜🎜Résumé : 🎜Les exceptions de pool de connexions sont des problèmes courants dans les opérations de base de données Java, mais ces problèmes peuvent être résolus efficacement en définissant un délai d'expiration de connexion raisonnable, en libérant la connexion à temps et en garantissant que la connexion peut être fermée correctement après utilisation. Dans l'exemple de code ci-dessus, nous avons utilisé Druid et C3P0, deux technologies de pool de connexions couramment utilisées. Ces technologies encapsulent bien le mécanisme de gestion des connexions sous-jacent et fournissent certaines configurations de paramètres pour optimiser l'efficacité du pool de connexions. Dans le développement réel, nous pouvons choisir la technologie de pool de connexions appropriée en fonction de besoins spécifiques et la combiner avec la configuration correspondante pour résoudre les exceptions du pool de connexions et améliorer les performances et la stabilité des opérations de base de données. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal