解決方法: 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(); } } } }
上記のコードでは、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(); } } } }上記のコードでは、
setMaxPoolSize、
setMaxIdleTime# を設定することで、接続プール内の最大接続数を制限できます。 ##接続の最大アイドル時間を定義します。接続プール内の接続のアイドル時間が設定時間を超えると、接続リーク例外がスローされます。 Final ブロックで conn.close()
メソッドを呼び出して接続を解放することで、接続リークの問題を回避できます。 概要:
以上が解決方法: Java データベース エラー: 接続プール例外の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。