Oracleデータベースのコネクションプール入門|Tomcat JDBCプールとOracle UCPの違いを比較

はじめに

Webアプリケーションでデータベースを利用する場合、処理ごとにデータベース接続を新規に作成すると大きなオーバーヘッドが発生し、アプリケーションのパフォーマンスが低下する可能性があります。特にアクセスが集中するシステムでは、接続処理がボトルネックになりやすくなります。

そこで有効なのがコネクションプールです。コネクションプールを利用することで、接続をあらかじめ作成してプールに保存し、必要なときに再利用できます。これにより、接続作成や破棄によるコストを削減し、Webアプリケーションの安定性向上とパフォーマンス向上を実現できます。

本記事では、Oracleデータベース、tomcatにおけるコネクションプールの仕組みや設定方法をわかりやすく解説し、アプリケーションのパフォーマンス最適化に役立つポイントを紹介します。

コネクションプールとは

コネクションプールとは、データベース接続をあらかじめ作成してプールに保管し、必要なときに再利用する仕組みです。これにより、接続の作成や破棄によるオーバーヘッド を削減できます。高いパフォーマンスが求められるシステムでは、コネクションプールの適用が推奨されます。

コネクションプールの基本的な流れ

  1. コネクションを事前に作成
    アプリケーション起動時や最初のアクセス時に、一定数のコネクションを作成してプールに保存します。コネクション作成のタイミングは製品仕様や設定によって異なります。理想的には、Tomcatなどのアプリケーションサーバ起動時に最初のDBアクセスが発生するよう設定し、起動と同時にコネクションを準備することが推奨されます。
  2. コネクションを払い出す(利用開始)
    アプリケーションがDBにアクセスする際は、プールから既存のコネクションを取得します。毎回新規に作成する必要はありません。
  3. コネクションを返却する(再利用可能にする)
    使用後のコネクションは破棄せずプールに戻し、次の処理で再利用します。

コネクションプールを使うメリット

  1. レスポンスとスループット向上
    新規接続では、TCPハンドシェイク、DBMS独自のハンドシェイク(Oracleの場合はOracle Net)、認証処理などが行われ、負荷がかかります。大量アクセスが発生するシステムでは、接続コストがボトルネックとなり、アプリケーションのレスポンス低下につながります。 コネクションプールを利用することで、すでに確立済みの接続を再利用できるため、レスポンスを大幅に改善可能です。また、突発的なトラフィック増加にも対応しやすく、システム全体のスループット向上が期待できます。
  2. 安定したリソース利用
    コネクションプールでは、データベースに対する最大接続数を設定可能です。急激に接続数が増加した場合でも、DBサーバーのメモリやCPUへの負荷を抑制でき、接続エラーやパフォーマンス低下を防ぐ ことができます。これにより、システム全体のリソース利用を安定させることができます。

コネクションプールの方式

コネクションプールの方式は大きく分けると、Tomcat や JBoss などのアプリケーションサーバ側で接続を管理する方式と、JDBC(※)が内部でコネクションをプールする方式の2種類に分類できます。

※JDBC(Java Database Connectivity) は、Javaプログラムからデータベースに接続し、SQLを実行するための 標準API です。

項目アプリケーションサーバ側JDBC側
管理者Tomcat, JBoss, WebLogicなどのサーバJavaアプリケーション(JDBC)
設定場所サーバの設定ファイル(Tomcatにおけるcontext.xml、server.xml)Javaコード内、または設定ファイルで指定
利用単位サーバ全体で共有(複数アプリケーションでも共通)アプリケーション単位で管理

ここでは、アプリケーションサーバにTomcat、データベースにOracleを用いた場合のコネクションプール方式を比較します。

Tomcat JDBCプール

Tomcatに標準で搭載されているアプリケーションサーバ側のコネクションプールです。プールはTomcat側で管理され、Tomcat上にコネクションプールが作成されます。

Oracle UCP

Oracleが提供する Universal Connection Pool (UCP) を利用する方式です。Oracle JDBCドライバと組み合わせて使用し、プールはJDBCドライバ上に作成されます。

項目Tomcat JDBCプールOracle UCP
管理主体Tomcat(アプリケーションサーバ)Oracle が提供する独立モジュール(ucp.jar)
設定場所context.xml や server.xmlJavaコード、または ucp.jar の API を利用
利用方法JNDI リソース経由で取得PoolDataSource クラスを利用
機能レベル基本的なプーリング(一般的な用途には十分)高機能(RAC対応、Fast Connection Failover、Connection Affinity など)
推奨度標準的
Tomcat利用時は使いやすい
Oracle推奨
メリット– Tomcatに組み込み済み
– 設定が簡単
– Java EE/Jakarta EE の標準に沿いやすい
– 高度な機能(スケーラビリティ、障害耐性)
– Oracle RAC 環境で強み
デメリット– Oracle固有の高度機能は利用不可– ucp.jar の追加が必要
– Tomcat組み込みより設定が複雑

Oracle UCPの特徴と利点

Oracle UCPの特徴と利点をもう少し詳細に見てみましょう。

高速接続フェイルオーバー(FCF(Fast Connection Failover))

Oracle RAC環境では、ノード障害やネットワーク障害が発生した際に、通常はTCPタイムアウトを待つ必要があり、アプリケーション側の接続切替に時間がかかることがあります。そこでFCFを利用することで、障害イベントを即座に検知し、不要になった接続をすぐに閉じて健全なノードへ切り替えることが可能です。これにより、アプリケーションの停止時間を最小限に抑えられます。

FCFが実行される流れは下記となります。

  1. ノードダウン
  2. ダウン検知
    Clusterwareがノードダウン、インスタンスダウン等を検知します。
  3. FANイベント(※)送信
    ClusterwareがFANイベントを作成し、ONS(※)を経由して、JDBCドライバおよびUCPにFANイベントを送信します。
  4. コネクション削除
    FANイベントを受け取ったUCPは、ダウンしたノードに紐づくコネクションを即時で削除します。
  5. 他インスタンスに再接続

※FAN(Fast Application Notification)
Oracle RACやData Guardにおいて、ノードやインスタンス、サービスの状態変化を即時に通知する仕組みです。具体的な通知対象は以下です。
・インスタンスやノードの停止/起動
・サービスの開始/停止
・負荷の変化(ロードバランスの最適化用)

※ONS(Oracle Notification Servivce)
FANイベントを配布するメッセージング層の仕組みです。FANイベントはONSデーモンに送付されます。

ランタイム接続ロードバランシング(RCLB)

Oracle RAC 環境において、アプリケーションがコネクションを取得する際に、各ノードの負荷状況(CPU使用率やレスポンス時間などの様々なバックエンドリソース)に応じて接続先を動的に選択する仕組みです。単純なラウンドロビン方式では、ノード間でリソース使用率やSQL実行数に差が生じることがありますが、RCLBを利用することで、より高精度に接続を振り分け、負荷を均等化することが可能です。

Instance A 25%、Instance B 75% と偏っている状況を想定します。この場合、Oracle RAC ロード・バランシング・アドバイザ(RAC Load Balancing Advisor: LBA) という Clusterware の機能が負荷情報を監視し、FAN イベントを生成して、リアルタイムにコネクションプールに提供します。

コネクションプールはこの負荷情報を受信すると、負荷を均等化するように接続先ノードを選択します。

接続アフィニティ

Oracle RACにおける標準的なロードバランスでは、接続は各ノードに均等に分散されます。しかし、アプリケーションによってはセッション変数やキャッシュを利用するために、同じノードへの接続を継続した方が効率的なケースがあります。このような場合に有効なのが 接続アフィニティ(Connection Affinity)です。接続アフィニティを利用することで、特定の処理やユーザーの接続を同じノードに関連付け、性能やキャッシュ効率を高めることができます。

UCPが提供する接続アフィニティは以下の種類があります。システムの要件に応じて、適切なアフィニティを有効化してください。

  1. トランザクションベースのアフィニティ (Transaction-Based Affinity)
    同じトランザクションにおいては、同じ RAC インスタンスへの接続を維持します。特に分散トランザクション (XAなど) が絡む場合、ノード切り替えによる性能コストが高くなるため有効な設定となります。
  2. Webセッション・アフィニティ (Web Session Affinity)
    Web アプリケーションのセッション単位で、同じノードを使い続けることができます。ユーザーが複数リクエストを行う Web セッション中のキャッシュ利用を最大化できます。
  3. Oracle RAC データ・アフィニティ (Data Affinity)
    特定のデータ(テーブルのパーティションまたは行のサブセット)を特定の RAC インスタンスに対応付けて、データアクセスの局所性を高め、ノード間の同期負荷や通信負荷をを削減する方法です。 データ・アフィニティを利用するには、「データ・アフィニティ・キー」を接続リクエスト時に指定する必要がある点にご留意ください。

まとめ

Oracleデータベースでのコネクションプールは、接続作成のオーバーヘッドを削減し、Webアプリのレスポンス向上と安定したスループットを実現します。
Tomcat環境では、軽量で設定が簡単なTomcat JDBCプールと、高機能でRAC対応のOracle UCPを使い分けることで、システム規模や可用性要件に応じた最適化が可能です。
適切なプールサイズや接続管理を行い、コネクションプールを正しく運用することで、Oracle+Tomcat環境のパフォーマンスを効果的に最大化できます。本記事を通じて理解を深めていただけると幸いです。

コメント