ホームページ >データベース >mysql チュートリアル >JDBC MySQL 接続プールの枯渇を防ぐには?
接続プールは、データベース接続を再利用することでアプリケーションのパフォーマンスを向上させることを目的としています。これにより、毎回新しい接続を確立するオーバーヘッドが回避されます。ただし、データベース接続が適切に管理されていない場合、接続プールが枯渇する可能性があります。
Java-JSF アプリケーションは、次のような理由により接続プールの枯渇に直面します。不適切な接続処理。アプリケーションは、GlassFish アプリケーション サーバーによって管理される接続プールから接続を取得します。大規模なデータベース操作の後、アプリケーションで次のエラーが発生します:
RAR5117 : Failed to obtain/create connection from connection pool [ mysql_testPool ]. Reason : In-use connections equal max-pool-size and expired max-wait-time. Cannot allocate more connections.
接続プール枯渇の根本原因はデータベース接続リークです。接続は使用後に適切に閉じられず、プール内に無期限に保持されることになります。閉じられていない各接続はプール内のスロットを消費し、最終的にスロットを使い果たし、アプリケーションが追加の接続を取得できなくなります。
接続プールの枯渇を解決するには、次のことが重要です。データベース接続が適切に処理されるようにします。これは、try-with-resources ブロックを使用して同じメソッド ブロック内で接続を取得して閉じることで実現でき、例外が存在する場合でも接続が常に閉じられるようにします。
public void create(Entity entity) throws SQLException { try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_CREATE); ) { statement.setSomeObject(1, entity.getSomeProperty()); // ... statement.executeUpdate(); } }
Java 7 以前を使用している場合は、try-finally ブロックを次のようにすることもできます。採用:
public void create(Entity entity) throws SQLException { Connection connection = null; PreparedStatement statement = null; try { connection = dataSource.getConnection(); statement = connection.prepareStatement(SQL_CREATE); statement.setSomeObject(1, entity.getSomeProperty()); // ... statement.executeUpdate(); } finally { if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} } }
接続プールを使用する場合でも、接続を手動で終了するのはアプリケーション開発者の責任であることを理解することが重要です。接続プールは、接続の終了を自動的に処理しません。代わりに、通常はラップされた接続アプローチを採用しており、実際に接続を閉じる前に、接続 close() メソッドが接続が再利用できるかどうかをチェックします。
そのため、接続を閉じることを怠ると、未使用の接続が蓄積される可能性があります。プール内でプールが枯渇し、その後アプリケーションがクラッシュする可能性があります。 JDBC 接続プールの健全性と効率を維持するには、適切な接続処理が非常に重要です。
以上がJDBC MySQL 接続プールの枯渇を防ぐには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。