ホームページ >Java >&#&チュートリアル >解決方法: Java データベース エラー: 接続プール例外

解決方法: Java データベース エラー: 接続プール例外

WBOY
WBOYオリジナル
2023-08-18 13:09:16971ブラウズ

解決方法: Java データベース エラー: 接続プール例外

解決方法: Java データベース エラー: 接続プール例外

はじめに:
Java をデータベース操作に使用する場合、接続プール例外の問題がよく発生します。 。接続プーリングは、データベース操作の効率を向上させるために設計されたテクノロジであり、確立されたデータベース接続を再利用し、頻繁な接続の作成と切断を回避できます。ただし、コネクションプールで例外が発生すると、コネクションの取得や解放ができなくなり、データベースの動作に問題が発生します。この記事では、いくつかの一般的な接続プールの例外を紹介し、解決策と関連するコード例を示します。

接続タイムアウト例外:
接続タイムアウト例外は主に、接続プール内の接続が長時間占有されていて解放できないことが原因で、接続プール内のすべての接続がいっぱいになって使用できなくなります。利用可能な接続を取得します。この問題を解決する方法は、コード内で接続タイムアウトを設定し、時間内に接続を解放することです。以下は、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();
            }
        }
    }
}

上記のコードでは、setMaxActivesetMaxWait# を設定することで、接続プール内の最大接続数を制限します。 # #接続の最大待機時間を定義します。コネクションプール内のコネクションがいっぱいになり、待ち時間が設定時間を超えると、コネクションタイムアウト例外がスローされます。接続が時間内にリサイクルできるようにするために、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();
            }
        }
    }
}

上記のコードでは、

setMaxPoolSizesetMaxIdleTime# を設定することで、接続プール内の最大接続数を制限できます。 ##接続の最大アイドル時間を定義します。接続プール内の接続のアイドル時間が設定時間を超えると、接続リーク例外がスローされます。 Final ブロッ​​クで conn.close() メソッドを呼び出して接続を解放することで、接続リークの問題を回避できます。 概要:

接続プールの例外は、Java データベース操作における一般的な問題ですが、適切な接続タイムアウトを設定し、適切なタイミングで接続を解放し、使用後に接続を正しく閉じることができるようにすることで、これらの問題を効果的に解決できます。上記のコード例では、一般的に使用される 2 つの接続プール テクノロジである druid と C3P0 を使用しました。これらのテクノロジは、基礎となる接続管理メカニズムを適切にカプセル化し、接続プールの効率を最適化するためのいくつかのパラメータ構成を提供します。実際の開発では、特定のニーズに応じて適切な接続プール テクノロジを選択し、対応する構成と組み合わせることで、接続プールの例外を解決し、データベース操作のパフォーマンスと安定性を向上させることができます。

以上が解決方法: Java データベース エラー: 接続プール例外の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。