Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Oracle Database Technology Night 92 Database Co...

Oracle Database Technology Night 92 Database Connection control FAN-AC

Oracle Database Technology Night #92 データベース・コネクションの積極的な制御 FAN/AC

2025/08/28開催 2時間

Real Application Clusters(RAC)はクラスタを構成するすべてのOracleインスタンスがすべてのデータにアクセス可能になっているため、一部のOracleインスタンスが停止しても残りのOracleインスタンスで全データへのアクセスを維持できます。
しかし、データベース・クライアントとデータベース・サーバーを接続するコネクションがトランザクションの途中で切断されてしまうと、アプリケーションに何らかのエラーが返ります。

Oracle Databaseには、データベース・コネクションを積極的に制御してOracleインスタンスの停止をアプリケーションからマスクする機能群があります。
RACのローリング・パッチ適用のような計画停止において、アプリケーションが正常にトランザクションを完了してから物理コネクションを切断したり、Oracleインスタンスが起動してきたことをトリガーとして物理コネクションを生成するFast Application Notificationがあります。
また、Oracleインスタンスが異常終了してデータベース・コネクションが切断されたことを検出すると自動で再接続し自動再実行することでアプリケーションにエラーを返さずトランザクションを正常完了させるApplication Continuityがあります。

今回は、「データベース・コネクションの積極的な制御 」と題して、主にFast Application NotificationとApplication Continuityについてお話しします。

Avatar for oracle4engineer

oracle4engineer PRO

August 28, 2025
Tweet

Video

More Decks by oracle4engineer

Other Decks in Programming

Transcript

  1. Connection Pool トランザクションの途中でデータベース・コネクションが切断されるとエラー Oracleインスタンスの停止でアプリケーションにエラーが返る アプリケーション・サーバー Clusterware Clusterware service service RACノード

    1 RACノード n 停止 非計画停止(異常終了) 計画停止(コマンドで停止) • メンテナンスのためにコマンドで停止 • RACローリング・パッチ適用 • 何らかの障害で異常終了 • 物理コネクション切断 Copyright © 2025, Oracle and/or its affiliates 2
  2. Connection Pool データベース・コネクションを積極的に制御する2つの機能群 Oracleインスタンスの停止をアプリケーションからマスクする アプリケーション・サーバー Clusterware Clusterware service service RACノード

    1 RACノード n 停止 計画停止(コマンドで停止) • メンテナンスのためにコマンドで停止 • RACローリング・パッチ適用 非計画停止(異常終了) • 何らかの障害で異常終了 • 物理コネクション切断 • アプリケーションがコネクションを プールに返却してから切断 • 自動再接続&自動再実行 Fast Application Notification (FAN) Application Continuity (AC) Copyright © 2025, Oracle and/or its affiliates 3
  3. データベース・コネクションの積極的な制御 前半 データベースに接続する • データベース・サービス Fast Application Notification • サーバー側のイベントをクライアント側に通知

    • RAC接続ロード・バランスに関する推奨変更 Fast Application Notification - 計画停止 • サービス停止時の安全な切断 • サービス起動後の接続とリバランス Fast Application Notification - 非計画停止 • 異常切断の検出を早める 後半 Fast Application Notification - イベント配信経路 • 通信経路の冗長化 Application Continuity • 切断を検出すると自動再接続&自動再実行 • 自動再実行できないケース FAN/ACの設定 - データベース・クライアント側 • JDBC thin driver & UCP • Oracle Data Provider for .NET Oracleインスタンスの停止をアプリケーションからマスクする Copyright © 2025, Oracle and/or its affiliates 4
  4. データベースに接続する - データベース・サービスに接続する Connection Pool アプリケーション・サーバー Clusterware Clusterware service service

    RACノード 1 RACノード n データベース Oracleインスタンスの名前 • INSTANCE_NAME • SID (ORACLE_SID) データベースの名前 • PDB_NAME • DB_UNIQUE_NAME • DB_NAME データベース・サービスを指定して接続する user/password@host:port/service Copyright © 2025, Oracle and/or its affiliates 7
  5. データベースに接続する - データベース・サービスに接続する Connection Pool アプリケーション・サーバー Clusterware Clusterware service service

    RACノード 1 RACノード n データベース・サービスを指定して接続する user/password@host:port/service データベース・サービスは • Oracleインスタンスの名前ではない • データベースの名前ではない データベース Oracleインスタンスの名前 • INSTANCE_NAME • SID (ORACLE_SID) データベースの名前 • PDB_NAME • DB_UNIQUE_NAME • DB_NAME Copyright © 2025, Oracle and/or its affiliates 8
  6. Oracleインスタンス・プロセスの持つ属性をグループ化してワークロードを管理 データベース・サービスはデータベース・セッションが持つ属性 oracle oracle 共有メモリー領域 • System Global Area LGWR

    DBWn Oracleインスタンス・プロセス • $ORACLE_HOME/bin/oracle データベース・サービス • セッションをグループ化する抽象概念 service1 SYS$BACKGROUND Oracleサーバー・プロセス バックグラウンド・プロセス Oracleインスタンス Copyright © 2025, Oracle and/or its affiliates 9
  7. データベース・サービスに接続 「データベースのワークロード」を表す抽象概念を指定して接続 tnslsnr データベース service2 Application1 Application2 user1/password1@host1:port1/service1 user1/password1@host1:port1/service2 user1

    host1:port1 同じデータベース・ユーザーへの接続でも アプリケーションごとにサービスを区別 service1 データベース・クライアント Oracleプロセスのワークロードをサービス ごとに区別 データベース・サーバー Copyright © 2025, Oracle and/or its affiliates 12
  8. データベース・サービスに接続する データベース・サービスがRACのノード構成を抽象化 Clusterware Clusterware RACノード 1 RACノード n service1 複数のOracleインスタンスが同じ

    サービスをアクティブにできる Application1 user1/password1@host1:port1/service1 データベース・クライアント tnslsnr host1:port1 Copyright © 2025, Oracle and/or its affiliates 13
  9. srvctl start/stop serviceコマンドでサービス起動を制御 データベース・サービスが起動しているOracleインスタンスにのみ接続可能 Clusterware Clusterware RACノード 1 RACノード n

    service1 service1 service2 service2 service3 service3 指定したOracleインスタンスの指定した サービスだけ停止させることが可能 特定のアプリケーションからの新規接続の 閉塞はサービス停止で制御する Copyright © 2025, Oracle and/or its affiliates 14
  10. データベース・サービスを追加する srvctlコマンド サービス追加 srvctl add service … サービス変更 srvctl modify

    service … サービス起動 srvctl start service … サービス停止 srvctl stop service … • アプリケーション接続用のサービスを作成 • FANやACのパラメータはサービスの属性 • 計画停止の操作 • srvctl stop instanceするとサービスが先に停止される ※デフォルト・サービスはパラメータ設定も起動/停止操作もできない Copyright © 2025, Oracle and/or its affiliates 15
  11. デフォルト値はDB_UNIQUE_NAMEを継承 DB_DOMAIN Oracleリスナーに登録されるサービス名 データベース名に由来するデフォルト・サービスと追加したサービスは扱いが異なる DB_NAME DB_UNIQUE_NAME SERVICE_NAMES PDB_NAME tnslsnr プラガブル・データベース

    ルート・コンテナ (またはNon-CDB構成) デフォルト値はDB_NAMEを継承 CREATE DATABASEの名前 CREATE PLUGGABLE DATABASEの名前 service デフォルト・サービス • MOUNTでアクティブ • 管理系 • 操作不可 追加したサービス • OPEN後にアクティブ • アプリケーション系 • 操作可能 追加したサービス Copyright © 2025, Oracle and/or its affiliates 16
  12. デフォルト・サービスをアプリケーションからの接続には使用しない アプリケーションからの接続には追加のサービスを作成する マニュアル: Oracle Database 19c Multitenant管理者ガイド https://docs.oracle.com/cd/F19136_01/multi/administering-pdbs-with-sql-plus.html#GUID-5A2471BC- 8501-4E38-BD28-7EE182F3B3A7 15.2.2.1.2

    デフォルトおよびユーザー定義のサービス PDBを作成すると、PDBの新しいデフォルト・サービスが自動的に作成されます。 各データベース・サービス名は、1つのCDB内で一意である必要があり、特定のリスナーからアクセスされるインスタンスを持つすべての CDBのスコープ内で一意である必要があります。デフォルト・サービスの名前はPDBと同じになります。このサービスは、ユーザーが管理で きず、管理タスクにのみ使用する必要があります。 アプリケーションには常にユーザー定義のサービスを使用します。これは、ユーザー定義のサービスはアプリケーションの要件に適合するよ うにカスタマイズできるためです。デフォルトのPDBサービスをアプリケーションに使用しないことをお薦めします。 • DB_UNIQUE_NAME/PDB_NAMEに由来するデフォルト・サービスにアプリケーションから接続してはならない • アプリケーションからの接続用のサービスを作成する • FAN/ACは追加したサービスに対してのみ設定可能 Copyright © 2025, Oracle and/or its affiliates 17
  13. Connection Pool データベース・コネクションを積極的に制御する2つの機能群 Oracleインスタンスの停止をアプリケーションからマスクする アプリケーション・サーバー Clusterware Clusterware FANイベント service service

    (Transparent) Application Continuity (透過的)アプリケーション・コンティニュイティ RACノード 1 RACノード n Fast Application Notification 高速アプリケーション通知 • 切断検出したら自動再実行 • (T)AC対応Oracle接続ドライバ • サーバー側のイベントをコネクション・プール に通知してコネクションを制御 • FAN対応コネクション・プール 停止 起動 計画停止(コマンドで停止) 非計画停止(異常終了) • 障害ノードとのコネクションを即時破棄 • コネクションがプールに返却されたら切断 非計画停止(異常終了) • 自動再接続&自動再実行 ※透過的アプリケーション・コンティニュイティ(TAC)とはアプ リケーション・コンティニュイティの動作モードの1つで、 19c以降ではほとんどの場合こちらを使用します Copyright © 2025, Oracle and/or its affiliates 19
  14. 一般的なアプリケーション・コード Connection Pool Connection Pool getConnection() close() SQL 1 SQL

    n COMMIT アプリケーション・コード 論理コネクション取得 論理コネクション返却 一般的なオンライン・トランザクション処理 • ロールバック可能な処理 • 最後に1回だけCOMMIT Copyright © 2025, Oracle and/or its affiliates 20
  15. 一般的なアプリケーション・コード Connection Pool Connection Pool getConnection() close() SQL 1 SQL

    n COMMIT アプリケーション・コード 論理コネクション取得 論理コネクション返却 • コネクション使用中に切断されるとエラー • トランザクション異常終了でロールバック 一般的なオンライン・トランザクション処理 • ロールバック可能な処理 • 最後に1回だけCOMMIT Copyright © 2025, Oracle and/or its affiliates 21
  16. Oracleインスタンスの停止をアプリケーションからマスクする アプリケーションから見たFANとACの動作 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT アプリケーション・コード 計画停止(コマンドで停止) 論理コネクション取得 論理コネクション返却→切断 Fast Application Notification • サービス停止しても処理継続 • 処理内容は関係ない • FANでコネクション切断の制御 • 論理コネクションを返却して切断 • 物理コネクションを切断してから Oracleインスタンス停止 Copyright © 2025, Oracle and/or its affiliates 22
  17. Oracleインスタンスの停止をアプリケーションからマスクする アプリケーションから見たFANとACの動作 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT アプリケーション・コード 計画停止(コマンドで停止) 非計画停止(異常終了) 論理コネクション取得 論理コネクション返却→切断 Fast Application Notification • サービス停止しても処理継続 • 処理内容は関係ない 論理コネクション取得 論理コネクション返却 Fast Application Notification • 切断検出を早める Application Continuity • 自動再接続&自動再実行 • 自動再実行できない処理がある • FANでコネクション切断の制御 • 論理コネクションを返却して切断 • FANで異常切断検出を早める • 切断検出したらACで再実行 • 物理コネクションを切断してから Oracleインスタンス停止 Copyright © 2025, Oracle and/or its affiliates 23
  18. Connection Pool データベース・サーバー側のイベントをデータベース・クライアントに通知 Fast Application Notification / 高速アプリケーション通知 アプリケーション・サーバー Clusterware

    Clusterware FANイベント service service RACノード 1 RACノード n Fast Application Notification 高速アプリケーション通知 • サーバー側のイベントをコネクション・プール に通知してコネクションを制御 • FAN対応コネクション・プール 停止 起動 計画停止(コマンドで停止) 非計画停止(異常終了) • 障害ノードとのコネクションを即時破棄 • コネクションがプールに返却されたら切断 Copyright © 2025, Oracle and/or its affiliates 25
  19. Connection Pool データベース・サーバー側で起きたイベントを基にコネクション・プールを制御するフレームワーク Fast Application Notification (FAN)/ 高速アプリケーション通知 アプリケーション・サーバー Clusterware

    Clusterware service1 RACノード 1 RACノード n service1 サービス停止 DOWNイベント サービス Oracleインスタンス ノード UPイベント サービス 負荷配分イベント サービス FANイベント FANイベントに応じてコネクションを制御する FAN対応コネクション・プール • Universal Connection Pool(UCP) • Oracle Call Interface Session Pool • Oracle Data Provider for .NET • 個々の物理コネクションがどのサービス、インス タンス、ノードに接続しているか把握している FANイベント Copyright © 2025, Oracle and/or its affiliates 26
  20. Connection Pool データベース・サーバー側で起きたイベントを基にコネクション・プールを制御するフレームワーク Fast Application Notification (FAN)/ 高速アプリケーション通知 アプリケーション・サーバー Clusterware

    Clusterware service1 RACノード 1 RACノード n service1 サービス停止 DOWNイベント サービス Oracleインスタンス ノード UPイベント サービス 負荷配分イベント サービス FANイベント コネクション切断 コネクション作成 (Java UCPのみ) リクエスト配分 FANイベント FANイベントに応じてコネクションを制御する FAN対応コネクション・プール • Universal Connection Pool(UCP) • Oracle Call Interface Session Pool • Oracle Data Provider for .NET • 個々の物理コネクションがどのサービス、インス タンス、ノードに接続しているか把握している Copyright © 2025, Oracle and/or its affiliates 27
  21. データベース・サーバー側で起きたイベントを基にコネクション・プールを制御するフレームワーク Fast Application Notification (FAN)/ 高速アプリケーション通知 DOWNイベント サービス Oracleインスタンス ノード

    UPイベント サービス 負荷配分イベント サービス FANイベント コネクション切断 コネクション作成 (Java UCPのみ) リクエスト配分 DOWN/UPイベントで物理コネクションを切断/作成 • Fast Connection Failover (FCF) • 高速接続フェイルオーバー 負荷配分比率に応じてリクエストを発行 • Runtime Connection Load Balancing (RCLB) • ランタイム接続ロード・バランス Copyright © 2025, Oracle and/or its affiliates 28
  22. FANイベントを受信して解釈できるOracle製コネクション・プール JDBC thin driver & Universal Connection Pool (UCP) •

    接続ドライバ(ojdbcn.jar)とコネクション・プール(ucp.jar)を別に提供 • Application Continuityを使用する場合もUCPと組み合わせる Oracle Call Interface Session Pool (OCI Session Pool) • Pro*CとPro*COBOLはOCI Session Poolに対応していないのでFAN/ACは使用できない • SQL*PlusはOCI Session PoolではないがAC対応 Oracle Data Provider for .NET (ODP.NET) • 21cまで: Unmanaged DriverのみAC対応、Managed Driverと.NET Core Driverは非対応 • 23aiから: Unmanaged Driverは非推奨機能、Managed Driverと.NET Core DriverがAC対応した FAN/AC 対応クライアント Copyright © 2025, Oracle and/or its affiliates 29
  23. 言語によって事情が異なる - JavaとJava以外に分かれる コネクション・プール機能はどの階層の持ち物か Application Server Connection Pool Application Server

    Connection Pool Javaアプリケーション・サーバー • JDBC Driver Java以外のアプリケーション・サーバー • Oracle Call Interface (OCI Session Pool) • Oracle Data Provider for .NET (ODP.NET) • コネクション・プール機能はアプリケーション・サーバーの役割 • Universal Connection Pool (UCP)を別途提供 • UCPを組み込むことをサポートしているか • コネクション・プール機能は接続ドライバの役割 • コネクション・プール機能はOracle接続ドライバと一体 UCP ucp.jar JDBC Driver ojdbcn.jar コネクション・プール → FAN 接続ドライバ → (T)AC Copyright © 2025, Oracle and/or its affiliates 30
  24. Fast Application Notification / 高速アプリケーション通知 RACの各Oracleインスタンスへの負荷配分を制御 • FAN - Runtime

    Connection Load Balancing (RCLB) / ランタイム接続ロード・バランス • ロードバランス設定の推奨方針変更 コネクションをアプリケーションから安全に切断 • Oracleインスタンスの計画停止 • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー サービス起動とコネクション作成の連動 • サービス起動後の接続と物理コネクションのリバランス • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー コネクションの異常切断の検出を早める • 接続ドライバがコネクションの切断検出に時間がかかる障害パターン • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー Copyright © 2025, Oracle and/or its affiliates 31
  25. Fast Application Notification / 高速アプリケーション通知 RACの各Oracleインスタンスへの負荷配分を制御 • FAN - Runtime

    Connection Load Balancing (RCLB) / ランタイム接続ロード・バランス • ロードバランス設定の推奨方針変更 コネクションをアプリケーションから安全に切断 • Oracleインスタンスの計画停止 • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー サービス起動とコネクション作成の連動 • サービス起動後の接続と物理コネクションのリバランス • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー コネクションの異常切断の検出を早める • 接続ドライバがコネクションの切断検出に時間がかかる障害パターン • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー Copyright © 2025, Oracle and/or its affiliates 32
  26. コネクション・プールを使用するとロードバランスに2階層がかかわる どのOracleインスタンスにSQLを発行するか Clusterware Clusterware RACノード 1 RACノード n Connection Pool

    Application コネクション・プールから論理コネクションを取り出すときの接続先 コネクション・プールの物理コネクションの接続先 コネクション・プールは複数のOracleインスタンスとの物理コネクションを持つ サービスが起動しているOracleインスタンスとの物理コネクションを持つ Copyright © 2025, Oracle and/or its affiliates 34
  27. コネクション・プールを使用するとロードバランスに2階層がかかわる どのOracleインスタンスにSQLを発行するか Clusterware Clusterware RACノード 1 RACノード n Connection Pool

    Application コネクション・プールから論理コネクションを取り出すときの接続先 コネクション・プールの物理コネクションの接続先 コネクション・プールは複数のOracleインスタンスとの物理コネクションを持つ • FAN - ランタイム接続ロード・バランス サービスが起動しているOracleインスタンスとの物理コネクションを持つ • サーバー側接続ロード・バランス • FAN - ランタイム接続ロード・バランス 負荷配分比率 FANイベント Copyright © 2025, Oracle and/or its affiliates 35
  28. ランタイム接続ロード・バランスは使用しない ロード・バランス設定の推奨設定の方針変更 Clusterware Clusterware RACノード 1 RACノード n Connection Pool

    Application コネクション・プールから論理コネクションを取り出すときの接続先 コネクション・プールの物理コネクションの接続先 コネクション・プールは複数のOracleインスタンスとの物理コネクションを持つ • FAN - ランタイム接続ロード・バランス サービスが起動しているOracleインスタンスとの物理コネクションを持つ • サーバー側接続ロード・バランス • FAN - ランタイム接続ロード・バランス ロード・バランス設定の推奨(サービスのデフォルトのまま) • clbgoal=LONG (セッション数均等) • rlbgoal=NONE (RCLBを使用しない) 負荷配分比率 FANイベント Copyright © 2025, Oracle and/or its affiliates 36
  29. 物理コネクションの接続先 サーバー側接続ロード・バランス FAN - Runtime Connection Load Balancing (RCLB) /

    ランタイム接続ロード・バランス Copyright © 2025, Oracle and/or its affiliates 37
  30. 物理コネクションの接続先をOracleリスナーがリダイレクトする サーバー側接続ロード・バランス Clusterware Clusterware RACノード 1 RACノード n tnslsnr tnslsnr

    tnslsnr Connection Pool ノード・リスナー SCANリスナー • クラスタのいずれかのノードで起動 • 接続リクエストのリダイレクト Oracleリスナー・プロセスには2つの役割がある • ノードごとに起動 • Oracleインスタンスとのセッション確立 Copyright © 2025, Oracle and/or its affiliates 38
  31. 物理コネクションの接続先をOracleリスナーがリダイレクトする サーバー側接続ロード・バランス Clusterware Clusterware RACノード 1 RACノード n tnslsnr tnslsnr

    tnslsnr Connection Pool ノード・リスナー SCANリスナー • ノードごとに起動 • Oracleインスタンスとのセッション確立 • クラスタのいずれかのノードで起動 • 接続リクエストのリダイレクト (1) データベース・クライアントがSCANリスナーに接続リクエスト発行 Copyright © 2025, Oracle and/or its affiliates 39
  32. 物理コネクションの接続先をOracleリスナーがリダイレクトする サーバー側接続ロード・バランス Clusterware Clusterware RACノード 1 RACノード n tnslsnr tnslsnr

    tnslsnr Connection Pool ノード・リスナー SCANリスナー • ノードごとに起動 • Oracleインスタンスとのセッション確立 • クラスタのいずれかのノードで起動 • 接続リクエストのリダイレクト (1) データベース・クライアントがSCANリスナーに接続リクエスト発行 (2) SCANリスナーが接続リクエストをノード・リスナーにリダイレクト Copyright © 2025, Oracle and/or its affiliates 40
  33. 物理コネクションの接続先をOracleリスナーがリダイレクトする サーバー側接続ロード・バランス Clusterware Clusterware RACノード 1 RACノード n tnslsnr tnslsnr

    tnslsnr Connection Pool ノード・リスナー SCANリスナー (1) データベース・クライアントがSCANリスナーに接続リクエスト発行 (2) SCANリスナーが接続リクエストをノード・リスナーにリダイレクト どのOracleインスタンスに接続させるかを決める アルゴリズムの設定がサービスごとにある Copyright © 2025, Oracle and/or its affiliates 41
  34. データベース・サービスの2つの属性 clbgoalとrlbgoal サーバー側接続ロード・バランスの設定 Clusterware Clusterware RACノード 1 RACノード n tnslsnr

    tnslsnr tnslsnr Connection Pool service srvctl add | modify service … -clbgoal LONG | SHORT -rlbgoal NONE | SERVICE_TIME | THROUGHPUT Copyright © 2025, Oracle and/or its affiliates 42
  35. データベース・サービスの2つの属性 clbgoalとrlbgoal サーバー側接続ロード・バランスの設定 Clusterware Clusterware RACノード 1 RACノード n tnslsnr

    tnslsnr tnslsnr Connection Pool service srvctl add | modify service … -clbgoal LONG | SHORT -rlbgoal NONE | SERVICE_TIME | THROUGHPUT LONG SHORT Oracleインスタンスごとにセッション数均等 (clbgoalのデフォルト) ロードバランシング・アドバイザに従う(RLBGOAL) CLBGOAL 振り分けアルゴリズムはサービスごとの属性 Copyright © 2025, Oracle and/or its affiliates 43
  36. データベース・サービスの2つの属性 clbgoalとrlbgoal サーバー側接続ロード・バランスの設定 Clusterware Clusterware RACノード 1 RACノード n tnslsnr

    tnslsnr tnslsnr Connection Pool service srvctl add | modify service … -clbgoal LONG | SHORT -rlbgoal NONE | SERVICE_TIME | THROUGHPUT LONG SHORT SERVICE_TIME THROUGHPUT Oracleインスタンスごとにセッション数均等 (clbgoalのデフォルト) ロードバランシング・アドバイザに従う(RLBGOAL) 応答時間最適化 スループット最適化 CLBGOAL RLBGOAL NONE 負荷配分比率を算出しない (rlbgoalのデフォルト) 振り分けアルゴリズムはサービスごとの属性 ロードバランシング・アドバイザが負荷配分を算出してFANイベントとして通知 → ランタイム接続ロード・バランス Copyright © 2025, Oracle and/or its affiliates 44
  37. SQL実行性能を観測し最適な負荷配分比率のガイドを生成 Load Balancing Advisory/ロードバランシング・アドバイザ Clusterware Clusterware RACノード 1 RACノード n

    OracleインスタンスがSQL実行性能を直接観測している GV$SERVICEMETRIC(_HISTORY)ビューの抜粋 列 説明 SERVICE_NAME サービス名 INST_ID Oracleインスタンス番号 DBTIMEPERCALL 1コール当たりの経過時間(マイクロ秒) CALLSPERSEC 1秒当たりのユーザー・コールの数 service1 Copyright © 2025, Oracle and/or its affiliates 45
  38. SQL実行性能を観測し最適な負荷配分比率のガイドを生成 Load Balancing Advisory/ロードバランシング・アドバイザ Clusterware Clusterware RACノード 1 RACノード n

    OracleインスタンスがSQL実行性能を直接観測している GV$SERVICEMETRIC(_HISTORY)ビューの抜粋 列 説明 SERVICE_NAME サービス名 INST_ID Oracleインスタンス番号 DBTIMEPERCALL 1コール当たりの経過時間(マイクロ秒) CALLSPERSEC 1秒当たりのユーザー・コールの数 RLBGOAL=SERVICE_TIME DBTIMEPERCALL最小化 RLBGOAL=THROUGHPUT CALLSPERSEC最大化 service1 Copyright © 2025, Oracle and/or its affiliates 46
  39. SQL実行性能を観測し最適な負荷配分比率のガイドを生成 Load Balancing Advisory/ロードバランシング・アドバイザ Clusterware Clusterware RACノード 1 RACノード n

    OracleインスタンスがSQL実行性能を直接観測している GV$SERVICEMETRIC(_HISTORY)ビューの抜粋 列 説明 SERVICE_NAME サービス名 INST_ID Oracleインスタンス番号 DBTIMEPERCALL 1コール当たりの経過時間(マイクロ秒) CALLSPERSEC 1秒当たりのユーザー・コールの数 RLBGOAL=SERVICE_TIME DBTIMEPERCALL最小化 RLBGOAL=THROUGHPUT CALLSPERSEC最大化 database=orcl service=service1 { {instance=orcl2 percent=60 flag=UNKNOWN aff=FALSE} {instance=orcl1 percent=40 flag=UNKNOWN aff=FALSE} } timestamp=2012-07-06 13:19:12 各Oracleインスタンスへの最適なリクエスト比率を算出→FANイベント service1 Copyright © 2025, Oracle and/or its affiliates 47
  40. SQL実行性能を観測し最適な負荷配分比率のガイドを生成 Load Balancing Advisory/ロードバランシング・アドバイザ Clusterware Clusterware RACノード 1 RACノード n

    OracleインスタンスがSQL実行性能を直接観測している GV$SERVICEMETRIC(_HISTORY)ビューの抜粋 列 説明 SERVICE_NAME サービス名 INST_ID Oracleインスタンス番号 DBTIMEPERCALL 1コール当たりの経過時間(マイクロ秒) CALLSPERSEC 1秒当たりのユーザー・コールの数 RLBGOAL=SERVICE_TIME DBTIMEPERCALL最小化 RLBGOAL=THROUGHPUT CALLSPERSEC最大化 database=orcl service=service1 { {instance=orcl2 percent=60 flag=UNKNOWN aff=FALSE} {instance=orcl1 percent=40 flag=UNKNOWN aff=FALSE} } timestamp=2012-07-06 13:19:12 各Oracleインスタンスへの最適なリクエスト比率を算出→FANイベント service1 の比率でリクエストを送ってきてほしい インスタンス1 40% インスタンス2 60% Copyright © 2025, Oracle and/or its affiliates 48
  41. データベース・サービスの2つの属性 clbgoalとrlbgoal サーバー側接続ロード・バランスの設定 Clusterware Clusterware RACノード 1 RACノード n tnslsnr

    tnslsnr tnslsnr Connection Pool service srvctl add | modify service … -clbgoal LONG | SHORT -rlbgoal NONE | SERVICE_TIME | THROUGHPUT LONG SHORT SERVICE_TIME THROUGHPUT Oracleインスタンスごとにセッション数均等 (clbgoalのデフォルト) ロードバランシング・アドバイザに従う(RLBGOAL) 応答時間最適化 スループット最適化 CLBGOAL RLBGOAL NONE 負荷配分比率を算出しない (rlbgoalのデフォルト) 振り分けアルゴリズムはサービスごとの属性 ロードバランシング・アドバイザが負荷配分を算出してFANイベントとして通知 → ランタイム接続ロード・バランス Copyright © 2025, Oracle and/or its affiliates 49
  42. ロードバランシング・アドバイザに従う(RLBGOAL) SHORT • デフォルトの CLBGOAL=LONG のままにする ランタイム接続ロード・バランスは使用しない ロード・バランス設定の推奨設定の方針変更 Clusterware Clusterware

    RACノード 1 RACノード n tnslsnr tnslsnr tnslsnr Connection Pool service srvctl add | modify service … -clbgoal LONG | SHORT -rlbgoal NONE | SERVICE_TIME | THROUGHPUT LONG SERVICE_TIME THROUGHPUT Oracleインスタンスごとにセッション数均等 (clbgoalのデフォルト) 応答時間最適化 スループット最適化 CLBGOAL RLBGOAL NONE 負荷配分比率を算出しない (rlbgoalのデフォルト) 振り分けアルゴリズムはサービスごとの属性 ロードバランシング・アドバイザが負荷配分を算出してFANイベントとして通知 → ランタイム接続ロード・バランス • ランタイム接続ロード・バランスは使用しない • デフォルトの RLBGOAL=NONE のままにする Copyright © 2025, Oracle and/or its affiliates 50
  43. ランタイム接続ロード・バランス ロードバランシング・アドバイザの負荷配分比率はFANイベントとして通知される Clusterware Clusterware RACノード 1 RACノード n tnslsnr tnslsnr

    tnslsnr Connection Pool service SERVICE_TIME THROUGHPUT 応答時間最適化 スループット最適化 RLBGOAL NONE 負荷配分比率を算出しない (rlbgoalのデフォルト) ロードバランシング・アドバイザが負荷配分を算出してFANイベントとして通知 → ランタイム接続ロード・バランス 負荷配分比率 FANイベント Application srvctl add | modify service … -clbgoal LONG | SHORT -rlbgoal NONE | SERVICE_TIME | THROUGHPUT 振り分けアルゴリズムはサービスごとの属性 Copyright © 2025, Oracle and/or its affiliates 52
  44. ランタイム接続ロード・バランス FAN対応コネクション・プールはFAN負荷配分比率イベントに従う Clusterware Clusterware RACノード 1 RACノード n tnslsnr tnslsnr

    tnslsnr Connection Pool service SERVICE_TIME THROUGHPUT 応答時間最適化 スループット最適化 RLBGOAL NONE 負荷配分比率を算出しない (rlbgoalのデフォルト) ロードバランシング・アドバイザが負荷配分を算出してFANイベントとして通知 → ランタイム接続ロード・バランス 負荷配分比率 FANイベント Application コネクション・プールから論理コネクションを取り出すときの接続先 • rlbgoalがSERVICE_TIMEまたはTHROUGHPUTだとLBAが負荷配分 比率を算出してFANイベントとして通知 • FAN対応コネクション・プールは負荷配分比率イベントの比率で論理コネク ションを取り出そうとする Copyright © 2025, Oracle and/or its affiliates 53
  45. ロードバランシング・アドバイザに従う(RLBGOAL) SHORT • デフォルトの CLBGOAL=LONG のままにする ランタイム接続ロード・バランスは使用しない ロード・バランス設定の推奨設定の方針変更 Clusterware Clusterware

    RACノード 1 RACノード n tnslsnr tnslsnr tnslsnr Connection Pool service srvctl add | modify service … -clbgoal LONG | SHORT -rlbgoal NONE | SERVICE_TIME | THROUGHPUT LONG SERVICE_TIME THROUGHPUT Oracleインスタンスごとにセッション数均等 (clbgoalのデフォルト) 応答時間最適化 スループット最適化 CLBGOAL RLBGOAL NONE 負荷配分比率を算出しない (rlbgoalのデフォルト) 振り分けアルゴリズムはサービスごとの属性 ロードバランシング・アドバイザが負荷配分を算出してFANイベントとして通知 → ランタイム接続ロード・バランス • ランタイム接続ロード・バランスは使用しない • デフォルトの RLBGOAL=NONE のままにする 負荷配分比率 FANイベント Copyright © 2025, Oracle and/or its affiliates 54
  46. Fast Application Notification / 高速アプリケーション通知 RACの各Oracleインスタンスへの負荷配分を制御 • FAN - Runtime

    Connection Load Balancing (RCLB) / ランタイム接続ロード・バランス • ロードバランス設定の推奨方針変更 コネクションをアプリケーションから安全に切断 • Oracleインスタンスの計画停止 • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー サービス起動とコネクション作成の連動 • サービス起動後の接続と物理コネクションのリバランス • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー コネクションの異常切断の検出を早める • 接続ドライバがコネクションの切断検出に時間がかかる障害パターン • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー Copyright © 2025, Oracle and/or its affiliates 55
  47. Connection Pool データベース・サーバー側で起きたイベントを基にコネクション・プールを制御する Fast Application Notification (FAN)/ 高速アプリケーション通知 アプリケーション・サーバー Clusterware

    Clusterware service1 RACノード 1 RACノード n service1 サービス停止 DOWNイベント サービス Oracleインスタンス ノード UPイベント サービス 負荷配分イベント サービス FANイベント FANイベントに応じてコネクションを制御する FAN対応コネクション・プール • Universal Connection Pool(UCP) • Oracle Call Interface Session Pool • Oracle Data Provider for .NET • 個々の物理コネクションがどのサービス、インス タンス、ノードに接続しているか把握している FANイベント Copyright © 2025, Oracle and/or its affiliates 57
  48. Connection Pool Fast Connection Failover (FCF) / 高速接続フェイルオーバー DOWNイベントでコネクション・プールが物理コネクションを切断する アプリケーション・サーバー

    Clusterware Clusterware service1 RACノード 1 RACノード n service1 サービス停止 DOWNイベント サービス Oracleインスタンス ノード サービス サービス FANイベント サービスDOWNイベント受信時のコネクション切断 停止した原因を区別 • 計画停止(コマンド) • 非計画停止(障害) 計画停止(コマンド) • アプリケーションがプールにコネクションを 返却したら切断 非計画停止(障害) • 即時切断 UPイベント 負荷配分イベント FANイベント Copyright © 2025, Oracle and/or its affiliates 58
  49. Connection Pool Oracleインスタンスが停止する前にサービスが停止する アプリケーション・サーバー Clusterware Clusterware service1 RACノード 1 RACノード

    n service1 サービス停止 サービスをコマンドで停止 新規のコネクション確立 • 不可 確立済みコネクション • 切断されず処理継続 Copyright © 2025, Oracle and/or its affiliates 59
  50. Connection Pool Oracleインスタンスが停止する前にサービスが停止する アプリケーション・サーバー Clusterware Clusterware service1 RACノード 1 RACノード

    n service1 サービス停止 サービスをコマンドで停止 新規のコネクション確立 • 不可 確立済みコネクション • 切断されず処理継続 1. サービスをコマンドで停止 2. クライアント側からコネクション切断 3. Oracleインスタンスをシャットダウン 確立済みコネクションは 処理継続 すべてのコネクション切断 Copyright © 2025, Oracle and/or its affiliates 60
  51. Connection Pool サービス停止からコネクション切断までを自動化 FAN - FCF アプリケーション・サーバー Clusterware Clusterware service1

    RACノード 1 RACノード n service1 サービス停止 サービスをコマンドで停止 新規のコネクション確立 • 不可 確立済みコネクション • 切断されず処理継続 1. サービスをコマンドで停止 2. クライアント側からコネクション切断 3. Oracleインスタンスをシャットダウン 確立済みコネクションは 処理継続 すべてのコネクション切断 SERVICE DOWN イベント通知 Copyright © 2025, Oracle and/or its affiliates 61
  52. reason属性 非計画停止(障害) Oracleインスタンスのクラッシュ 計画停止(コマンド) srvctl stop service | instance …

    Oracle Clusterwareは非計画停止と計画停止を区別してDOWNイベントを発行 VERSION=1.0 event_type=SERVICEMEMBER service=rac23apdb1svc1 instance=rac23a1 database=rac23a db_domain= host=ptvm30 status=down reason=FAILURE timestamp=2024-11-11 14:58:10 timezone=+09:00 VERSION=1.0 event_type=SERVICEMEMBER service=rac23apdb1svc1 instance=rac23a1 database=rac23a db_domain= host=ptvm30 status=down reason=USER timestamp=2024-11-11 14:55:05 timezone=+09:00 ※ 読みやすいように改行を入れていますが、実際のFANイベントは改行なしの1行で出力されます どのサービスが どのOracleインスタンスで どのデータベースで どのホストで どういう理由で 停止したかが通知される Copyright © 2025, Oracle and/or its affiliates 62
  53. 非計画停止と計画停止を区別する 非計画停止(障害) Oracleインスタンスのクラッシュ 計画停止(コマンド) srvctl stop service | instance …

    DOWNイベントのreason属性によるコネクション・プールの挙動 VERSION=1.0 event_type=SERVICEMEMBER service=rac23apdb1svc1 instance=rac23a1 database=rac23a db_domain= host=ptvm30 status=down reason=FAILURE timestamp=2024-11-11 14:58:10 timezone=+09:00 VERSION=1.0 event_type=SERVICEMEMBER service=rac23apdb1svc1 instance=rac23a1 database=rac23a db_domain= host=ptvm30 status=down reason=USER timestamp=2024-11-11 14:55:05 timezone=+09:00 どのサービスが どのOracleインスタンスで どのデータベースで どのホストで どういう理由で 停止したかが通知される reason=FAILURE コネクション即時破棄 reason=USER プールにコネクションが返却されたら破棄 Copyright © 2025, Oracle and/or its affiliates 63
  54. コネクション・プールから論理コネクションを借りて返却 一般的なオンライン・トランザクション処理コード Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT 一般的なオンライン・トランザクション処理コード プールに論理コネクション返却 プールから論理コネクション取得 SQL処理 Copyright © 2025, Oracle and/or its affiliates 64
  55. アプリケーション・スレッドがコネクションを返却したら切断 FANによるサービスの計画停止とコネクション切断処理 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT Connection Pool アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード n 一般的なオンライン・トランザクション処理コード Application service1 service1 (1) プールから論理コネクション取得 (1) コネクション取得 Copyright © 2025, Oracle and/or its affiliates 65
  56. アプリケーション・スレッドがコネクションを返却したら切断 FANによるサービスの計画停止とコネクション切断処理 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT Connection Pool アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード n サービス停止 (1) プールから論理コネクション取得 一般的なオンライン・トランザクション処理コード (2) コマンドでサービス計画停止 Application service1 service1 (2) サービス停止 Copyright © 2025, Oracle and/or its affiliates 66
  57. アプリケーション・スレッドがコネクションを返却したら切断 FANによるサービスの計画停止とコネクション切断処理 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT Connection Pool アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード n FANイベント (3) コネクションを使用している途 中でサービスDOWNの計画 停止イベントが来ても切断さ れず処理継続 (1) プールから論理コネクション取得 一般的なオンライン・トランザクション処理コード (2) コマンドでサービス計画停止 Application service1 (3) FANイベント Copyright © 2025, Oracle and/or its affiliates 67
  58. アプリケーション・スレッドがコネクションを返却したら切断 FANによるサービスの計画停止とコネクション切断処理 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT Connection Pool アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード n (3) コネクションを使用している途 中でサービスDOWNの計画 停止イベントが来ても切断さ れず処理継続 (1) プールから論理コネクション取得 (4) プールに論理コネクション返却 一般的なオンライン・トランザクション処理コード (2) コマンドでサービス計画停止 Application service1 (4) 返却 Copyright © 2025, Oracle and/or its affiliates 68
  59. アプリケーション・スレッドがコネクションを返却したら切断 FANによるサービスの計画停止とコネクション切断処理 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT Connection Pool アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード n (3) コネクションを使用している途 中でサービスDOWNの計画 停止イベントが来ても切断さ れず処理継続 (1) プールから論理コネクション取得 (4) プールに論理コネクション返却 (5) 該当する物理コネクション切断 一般的なオンライン・トランザクション処理コード (2) コマンドでサービス計画停止 Application service1 (5) 切断 Copyright © 2025, Oracle and/or its affiliates 69
  60. アプリケーション・スレッドがコネクションを返却したら切断 FANによるサービスの計画停止とコネクション切断処理 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT Connection Pool アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード n (3) コネクションを使用している途 中でサービスDOWNの計画 停止イベントが来ても切断さ れず処理継続 (1) プールから論理コネクション取得 (4) プールに論理コネクション返却 (5) 該当する物理コネクション切断 一般的なオンライン・トランザクション処理コード (2) コマンドでサービス計画停止 Application service1 (6) すべて切断 Copyright © 2025, Oracle and/or its affiliates 70
  61. アプリケーション・スレッドがコネクションを返却したら切断 FANによるサービスの計画停止とコネクション切断処理 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT Connection Pool アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード n (3) コネクションを使用している途 中でサービスDOWNの計画 停止イベントが来ても切断さ れず処理継続 (1) プールから論理コネクション取得 (4) プールに論理コネクション返却 (5) 該当する物理コネクション切断 一般的なオンライン・トランザクション処理コード (2) コマンドでサービス計画停止 Application service1 (7) Oracleインスタンス停止 Copyright © 2025, Oracle and/or its affiliates 71
  62. srvctlコマンド サービス停止 $ srvctl stop service -db DB_UNIQUE_NAME -instance INSTANCE

    -service SERVICE -force [-drain_timeout N(秒)] サービスが停止すると新規の接続ができなくなる / 確立済みコネクションは接続されたまま Clusterware Clusterware RACノード 1 RACノード n service1 service1 service2 service2 service3 service3 (1) srvctl stop service 発行 Copyright © 2025, Oracle and/or its affiliates 72
  63. srvctl stop instanceコマンドはサービス停止とOracleインスタンス停止を連動させる Oracleインスタンス停止コマンドとサービス停止の連動 $ srvctl stop instance -db DB_UNIQUE_NAME

    -instance INSTANCE_NAME_LIST [-drain_timeout N(秒)] [-stop_option IMMEDIATE] -force Oracleインスタンスの停止コマンドを発行すると、そのインスタンスで稼働しているサービスが先に停止する Clusterware Clusterware RACノード 1 RACノード n service1 service1 service2 service2 service3 service3 (2) Oracleインスタンス停止コマンドを発行 すると、先にサービスのリソースが停止する (1) srvctl stop instance 発行 (3) 最大でdrain_timeout秒待って Oracleインスタンス停止 Copyright © 2025, Oracle and/or its affiliates 73
  64. drain_timeoutとは? Oracleインスタンス停止コマンドとサービス停止の連動 Oracleインスタンスの停止コマンドを発行すると、そのインスタンスで稼働しているリソースが先に停止する サービス停止と物理コネクション切断 Oracleインスタンスshutdown (1) srvctl stop instance発行 (2)

    サービス停止 drain_timeout N(秒) • Oracleインスタンスshutdown前に物理コネクション切断を待機する「最大」猶予時間 • この間にコネクション・プールがすべての物理コネクションを切断することを期待 • N秒より前にすべての物理コネクションが切断されたらその時点でshutdown開始 (3) サービスDOWNイベント発行 (4) Oracleインスタンスshutdown開始 (5) インスタンスDOWNイベント発行 $ srvctl stop instance -db DB_UNIQUE_NAME -instance INSTANCE_NAME_LIST [-drain_timeout N(秒)] [-stop_option IMMEDIATE] -force Copyright © 2025, Oracle and/or its affiliates 74
  65. Fast Application Notification / 高速アプリケーション通知 RACの各Oracleインスタンスへの負荷配分を制御 • FAN - Runtime

    Connection Load Balancing (RCLB) / ランタイム接続ロード・バランス • ロードバランス設定の推奨方針変更 コネクションをアプリケーションから安全に切断 • Oracleインスタンスの計画停止 • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー サービス起動とコネクション作成の連動 • サービス起動後の接続と物理コネクションのリバランス • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー コネクションの異常切断の検出を早める • 接続ドライバがコネクションの切断検出に時間がかかる障害パターン • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー Copyright © 2025, Oracle and/or its affiliates 75
  66. Fast Connection Failover (FCF) / 高速接続フェイルオーバー サービスUPイベントによるコネクション作成 Connection Pool アプリケーション・サーバー

    Clusterware Clusterware RACノード 1 RACノード n service1 サービス起動 サービスUPイベントによるコネクション作成 service1 FANイベント Copyright © 2025, Oracle and/or its affiliates 78
  67. Fast Connection Failover (FCF) / 高速接続フェイルオーバー サービスUPイベントによるコネクション作成直後は本数が偏る Connection Pool アプリケーション・サーバー

    Clusterware Clusterware RACノード 1 RACノード n service1 サービス起動 サービスUPイベントによるコネクション作成 service1 Java UCPのみUPイベントに対応 • サービスUPイベントをトリガーとして物理コネク ション作成 • 接続先は接続文字列に従う 作成される本数 • コネクション本数をMax以下に維持するため、 未使用コネクションを切断することがある • コネクション本数はインスタンスごとに偏る サービス起動直後はOracleインスタンス ごとのコネクション本数がかなり偏る ⇒ コネクションをリバランスする FANイベント Copyright © 2025, Oracle and/or its affiliates 79
  68. 負荷配分比率イベントを受信したFAN対応コネクション・プールは定常的に物理コネクションをリバランスする ランタイム接続ロード・バランス Clusterware Clusterware RACノード 1 RACノード n tnslsnr tnslsnr

    tnslsnr service1 Connection Pool Application コネクション・プールから論理コネクションを取り出すときの接続先 コネクション・プールの定常的な物理コネクションの切断(リバランス) サーバー側接続ロード・バランスでの物理コネクションの接続先 FANイベント (負荷配分比率) Copyright © 2025, Oracle and/or its affiliates 80
  69. 負荷配分比率イベントを受信したFAN対応コネクション・プールは定常的に物理コネクションをリバランスする ランタイム接続ロード・バランスは使用しない Clusterware Clusterware RACノード 1 RACノード n tnslsnr tnslsnr

    tnslsnr service1 Connection Pool Application コネクション・プールの定常的な物理コネクションの切断(リバランス) FANイベント (負荷配分比率) サービスUPイベント受信直後の物理コネクション本数の偏りを解消する手段 → ランタイム接続ロード・バランスは使わない方針に変更したので別の手段を使う コネクション・プールから論理コネクションを取り出すときの接続先 サーバー側接続ロード・バランスでの物理コネクションの接続先 Copyright © 2025, Oracle and/or its affiliates 81
  70. コネクション・プールの物理コネクションのリバランスにもかかわる ランタイム接続ロード・バランスを使う場合 • Runtime Connection Load Balancingを使用する(rlbgoal=SERVICE_TIME | THROUGHPUT)場合は clbgoal=SHORT

    • 物理コネクションの配分もRCLBに従う • RCLBが有効だとコネクション・プールは定常的に物理コネクションの再作成を行うことでリバランスされていた 接続ロード・バランスの推奨設定の方針変更 • 物理コネクションの配分はセッション数均等(デフォルトの clbgoal=LONG のまま) • ランタイム接続ロード・バランスは使用しない(デフォルトの rlbgoal=NONE のまま) • コネクション・プールが物理コネクションの定常的な切断を行わくなる • 物理コネクションのリバランスはコネクション・プールのパラメータで物理コネクションに寿命を持たせる • UCPの場合 - setMaxConnectionReuseTime() - 指定した秒数存在したら切断 - setMaxConnectionReuseCount() - 指定した回数使用したら切断 - minの本数を下回ったらminを満たすように物理コネクションを生成する ランタイム接続ロード・バランスの方針変更 Copyright © 2025, Oracle and/or its affiliates 82
  71. 物理コネクションに寿命を持たせてリバランス 物理コネクションの切断→作成を定常的に行う 物理コネクション本数 max min FAN DOWNイベントや物理 コネクション寿命パラメータで 切断されるとminを下回る minを下回るとminを満たす

    ように物理コネクションを作成 する 現在の本数 現在の本数 現在の本数 物理コネクションに寿命を持たせて定常的に切断→作成 • 接続先はサーバー側接続ロード・バランスに従う • 推奨設定は clbgoal=LONG (セッション数均等) よくある設定は min=max Copyright © 2025, Oracle and/or its affiliates 86
  72. Fast Application Notification / 高速アプリケーション通知 RACの各Oracleインスタンスへの負荷配分を制御 • FAN - Runtime

    Connection Load Balancing (RCLB) / ランタイム接続ロード・バランス • ロードバランス設定の推奨方針変更 コネクションをアプリケーションから安全に切断 • Oracleインスタンスの計画停止 • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー サービス起動とコネクション作成の連動 • サービス起動後の接続と物理コネクションのリバランス • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー コネクションの異常切断の検出を早める • 接続ドライバがコネクションの切断検出に時間がかかる障害パターン • FAN - Fast Connection Failover (FCF) / 高速接続フェイルオーバー Copyright © 2025, Oracle and/or its affiliates 87
  73. OSとハードウェアは正常でOracleプロセスがクラッシュ • 否定的な応答があるので一瞬で切断検出 • OSがプロセスのクリーンアップ作業の一環としてTCP FIN/RST応答 ノード障害などでOSからのTCP/IPレベルで応答がなくなる • 応答がないので「待つ」 •

    TCPレベルで応答させる - Oracle Grid Infrastructure: VIPフェイルオーバー - TCPソケット: TCP再送タイマー/TCP keepaliveタイマー • FAN - Fast Connection Failover / 高速接続フェイルオーバー - DOWNイベントを明示的に通知することでコネクション・プールが物理コネクションを切断 障害パターンによってはTCP/IPレベルで切断検出に時間がかかる Copyright © 2025, Oracle and/or its affiliates 89
  74. • OSとハードウェアは正常でOracle関係のプロセスがクラッシュ • OSがFIN/RST応答 • ノード障害などでOSからのIPレベルで応答がなくなる • TCP再送タイムアウト • TCP

    keepalive (受信待ちを再送タイムアウトに変形) - 最後の通信から指定時間通信がなかったらkeepaliveプローブを出す - keepaliveプローブを出すまでの時間のOSカーネル・パラメータはデフォルト7200秒なので要調整 - keepaliveプローブに応答がなければTCP再送タイムアウト待ち • Oracle Clusterwareによる仮想IPアドレス(Virtual IP Address: VIP)フェイルオーバー - 応答を返せるように常にネットワーク上にIPアドレスを存在させようとする仕組み - TCP再送にRST応答 TCP/IPレベルでの切断検出の高速化 Copyright © 2025, Oracle and/or its affiliates 90
  75. TCP/IPの異常系の挙動 (2) OS以下が異常で無応答になる場合 送信時 受信待ち時 tnslsnr sqlplus OS Hardwar e

    OS Hardwar e OS タイムアウト oracle sqlplus OS Hardwar e OS Hardwar e ずっと待ち read() ACKがない ので再送 connect() write() Copyright © 2025, Oracle and/or its affiliates 92
  76. TCP/IPの異常系の挙動 (2) OS以下が異常で無応答になる場合 送信時 受信待ち時 tnslsnr sqlplus OS Hardwar e

    OS Hardwar e OS タイムアウト oracle sqlplus OS Hardwar e OS Hardwar e ずっと待ち read() ACKがない ので再送 connect() write() TCP/IPレベルでの切断検出を早める方法 Oracle Database Technology Night #52 Oracle Databaseのネットワーク接続 https://speakerdeck.com/oracle4engineer/oracle-database-oracle-net-services?slide=85 Copyright © 2025, Oracle and/or its affiliates 93
  77. Connection Pool データベース・サーバー側のイベントをデータベース・クライアントに通知 Fast Application Notification / 高速アプリケーション通知 アプリケーション・サーバー Clusterware

    Clusterware FANイベント service service RACノード 1 RACノード n Fast Application Notification 高速アプリケーション通知 • サーバー側のイベントをコネクション・プール に通知してコネクションを制御 • FAN対応コネクション・プール 停止 起動 計画停止(コマンドで停止) 非計画停止(異常終了) • 障害ノードとのコネクションを即時破棄 • コネクションがプールに返却されたら切断 Copyright © 2025, Oracle and/or its affiliates 94
  78. 非計画停止と計画停止を区別する 非計画停止(障害) Oracleインスタンスのクラッシュ 計画停止(コマンド) srvctl stop service | instance …

    DOWNイベントのreason属性によるコネクション・プールの挙動 VERSION=1.0 event_type=SERVICEMEMBER service=rac23apdb1svc1 instance=rac23a1 database=rac23a db_domain= host=ptvm30 status=down reason=FAILURE timestamp=2024-11-11 14:58:10 timezone=+09:00 VERSION=1.0 event_type=SERVICEMEMBER service=rac23apdb1svc1 instance=rac23a1 database=rac23a db_domain= host=ptvm30 status=down reason=USER timestamp=2024-11-11 14:55:05 timezone=+09:00 どのサービスが どのOracleインスタンスで どのデータベースで どのホストで どういう理由で 停止したかが通知される reason=FAILURE コネクション即時破棄 reason=USER プールにコネクションが返却されたら破棄 Copyright © 2025, Oracle and/or its affiliates 95
  79. Connection Pool Fast Connection Failover (FCF) / 高速接続フェイルオーバー reason=FAILUREのDOWNイベントならば物理コネクションを即時切断 アプリケーション・サーバー

    Clusterware Clusterware FANイベント service service RACノード 1 RACノード n DOWN reason=FAILURE 停止 非計画停止(異常終了) • 障害ノードとのコネクションを即時破棄 Copyright © 2025, Oracle and/or its affiliates 96
  80. データベース・コネクションの積極的な制御 前半 データベースに接続する • データベース・サービス Fast Application Notification • サーバー側のイベントをクライアント側に通知

    • RAC接続ロード・バランスに関する推奨変更 Fast Application Notification - 計画停止 • サービス停止時の安全な切断 • サービス起動後の接続とリバランス Fast Application Notification - 非計画停止 • 異常切断の検出を早める 後半 Fast Application Notification - イベント配信経路 • 通信経路の冗長化 Application Continuity • 切断を検出すると自動再接続&自動再実行 • 自動再実行できないケース FAN/ACの設定 - データベース・クライアント側 • JDBC thin driver & UCP • Oracle Data Provider for .NET Oracleインスタンスの停止をアプリケーションからマスクする Copyright © 2025, Oracle and/or its affiliates 97
  81. FAN対応クライアントは複数のOracle Grid Infrastructureノードに対してFANコネクションを作成する FANイベントの配信 アプリケーション・サーバー Clusterware Clusterware Connection Pool RACノード

    1 RACノード n FANコネクション FANコネクション ons ons • Oracle Notification Service • Oracle Clusterwareのプロセス • デフォルト6200/tcp でLISTEN FANイベント配信プロセス: ons FAN対応クライアント FANコネクション 6200/tcp Copyright © 2025, Oracle and/or its affiliates 99
  82. Connection Pool FANイベントがどこかのノードで生成される FANイベントの配信 アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード

    n FANコネクション FANコネクション ons ons FANイベント (1) FANイベント生成 Copyright © 2025, Oracle and/or its affiliates 100
  83. Connection Pool FANイベントがどこかのノードで生成されるとOracle Clusterwareのすべてのノードに複製される FANイベントの配信 アプリケーション・サーバー Clusterware Clusterware RACノード 1

    RACノード n FANコネクション FANコネクション ons ons FANイベント FANイベント 複製 (2) FANイベントを全ノードに複製 Copyright © 2025, Oracle and/or its affiliates 101
  84. Connection Pool FAN対応クライアントは複数のFANコネクションから同じFANイベントを受信する FANイベントの配信 アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード

    n ons ons FANイベント FANイベント 複製 FANイベント FANイベント (3) 全ノードから同じFANイベント配信 (3) 全ノードから同じFANイベント配信 Copyright © 2025, Oracle and/or its affiliates 102
  85. FAN対応クライアントは複数のFANコネクションから同じFANイベントを受信する → 経路の冗長化 FANイベントの配信 アプリケーション・サーバー Clusterware Clusterware RACノード 1 RACノード

    n ons ons FANイベント FANイベント 複製 FANイベント FANイベント データベース・サーバー障害に対する FANイベント配信経路の冗長化 Connection Pool Copyright © 2025, Oracle and/or its affiliates 103
  86. FANコネクションの接続先設定 FANコネクションの接続先をデータベース接続文字列から推定 • 12c以降の標準的な方法 • FANコネクションの接続先を明示的に設定しなかった場合 • Oracle Database 12c

    Release 1 ~ in-band FAN • OCI Autonomous Database ServerlessでのFANイベント配信経路 • SQL実行用コネクションがFANイベント配信経路にもなる • Oracle Database 19c RU19.10+ • 接続ドライバの種類によって実装されたRUが異なる FANコネクションの接続先を明示的に設定 • 接続ドライバごとの固有の設定方法 • FANが最初に実装されたOracle Database 10g Release 1からある方法 Copyright © 2025, Oracle and/or its affiliates 105
  87. FANコネクションの接続先 - 明示的にONS接続先を指定しなかった場合 データベース接続文字列から推定 (Oracle Database 12c Release 1 ~)

    Connection Pool アプリケーション・サーバー (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = SCAN-HOSTNAME)(PORT = port) ) (CONNECT_DATA = (SERVICE_NAME = service1) ) ) SCAN-HOSTNAME:port/service1 データベース接続文字列 • Oracle Grid Infrastructureを使用する構成の場合、データベース接続文字列はSCANリスナーのホスト名を指す • ONSへの接続先を明示的に指定しない場合、データベース接続文字列のホスト名をFANコネクションの接続先とする Copyright © 2025, Oracle and/or its affiliates 106
  88. Single Client Access Name (SCAN) クラスタ・ノード数に依存せずデータベース接続先ホスト名を1つにする仕組み Connection Pool アプリケーション・サーバー (DESCRIPTION

    = (ADDRESS = (PROTOCOL = TCP) (HOST = SCAN-HOSTNAME)(PORT = port) ) (CONNECT_DATA = (SERVICE_NAME = service1) ) ) SCAN-HOSTNAME:port/service1 データベース接続文字列 SCAN-VIP1 SCAN-VIP2 SCAN-VIP3 SCAN-HOSTNAME ホスト名 IPアドレス DNS Single Client Access Name (SCAN)はDNSで 複数(一般的には3つ)のIPアドレスに対応付けされる Copyright © 2025, Oracle and/or its affiliates 107
  89. Single Client Access Name (SCAN) クラスタ・ノード数に依存せずデータベース接続先ホスト名を1つにする仕組み Clusterware Clusterware Clusterware Clusterware

    RACノード 1 RACノード 2 RACノード 3 RACノード n tnslsnr tnslsnr tnslsnr SCAN-VIP1 SCAN-VIP2 SCAN-VIP3 Connection Pool アプリケーション・サーバー SCANリスナーと SCAN VIPの複数 セットが起動 Copyright © 2025, Oracle and/or its affiliates 108
  90. Single Client Access Name (SCAN) クラスタ・ノード数に依存せずデータベース接続先ホスト名を1つにする仕組み Clusterware Clusterware Clusterware Clusterware

    RACノード 1 RACノード 2 RACノード 3 RACノード n tnslsnr tnslsnr tnslsnr SCAN-VIP1 SCAN-VIP2 SCAN-VIP3 Connection Pool アプリケーション・サーバー 1. データベース接続文字列にSCANホスト名を指定 2. SCANはDNSで複数(一般的には3つ)のIPアドレスに対応付けされる 3. データベース接続リクエスト発行先の冗長化 • データベース接続リクエスト発行 • 失敗したら次の接続先を試行 SCANリスナーと SCAN VIPの複数 セットが起動 Copyright © 2025, Oracle and/or its affiliates 109
  91. FANコネクションの接続先 - 明示的にONS接続先を指定しなかった場合 データベース接続文字列から推定 (Oracle Database 12c Release 1 ~)

    Clusterware Clusterware ons ons Clusterware ons Clusterware ons RACノード 1 RACノード 2 RACノード 3 RACノード n onsプロセスは 全ノードで常時起動 SCAN-VIP1 SCAN-VIP2 SCAN-VIP3 Connection Pool アプリケーション・サーバー 1. データベース接続文字列にSCANホスト名を指定 2. SCANはDNSで複数(一般的には3つ)のIPアドレスに対応付けされる 3. FANコネクションの冗長化 SCAN-VIP3:6200 SCAN-VIP2:6200 SCAN-VIP1:6200 6200/tcp 6200/tcp 6200/tcp 6200/tcp FANコネクション Copyright © 2025, Oracle and/or its affiliates 110
  92. OCI Autonomous Database Serverless SQL実行用コネクションしか接続できない Connection Pool アプリケーション・サーバー Clusterware Clusterware

    RACノード 1 RACノード n ons ons Oracle Connection Manager SQL実行用コネクション しか通信経路がない データベース・サーバーとの間にOracle Connection Manager (CMAN)がいる Copyright © 2025, Oracle and/or its affiliates 112
  93. OCI Autonomous Database ServerlessでのFAN onsプロセスへの通信経路がふさがれている Connection Pool アプリケーション・サーバー Clusterware Clusterware

    RACノード 1 RACノード n FANコネクション FANコネクション ons ons Oracle Connection Manager SQL実行用コネクション しか通信経路がない Copyright © 2025, Oracle and/or its affiliates 113
  94. OCI Autonomous Database ServerlessでのFAN: in-band FAN onsプロセスへの通信経路がふさがれているので別のFANイベント配信経路が追加された Connection Pool アプリケーション・サーバー

    Clusterware Clusterware RACノード 1 RACノード n ons ons Oracle Connection Manager SQL実行用コネクション しか通信経路がない in-band FAN SQL実行用コネクションでFANイベント配信 • Oracle Database 19cのRU19.10+で実装 • 接続ドライバの種類によって実装したRUが異なる • 最新のRUの使用を推奨 Copyright © 2025, Oracle and/or its affiliates 114
  95. FANの設定 データベース・サーバー側 (Oracle Grid Infrastructure) • ONSがFANイベントを配信するよう構成済み • UP/DOWNイベントは何も設定しなくとも生成される •

    データベース・サービスごとのランタイム接続ロード・バランスの設定 - RLBGOAL=SERVICE_TIME | THROUGHPUTに設定すると負荷配分比率イベントが生成される - ただしRCLBは使用しない方向に方針転換された データベース・クライアント側 (→ACとまとめて最後に説明) • 接続ドライバの種類ごとに固有の設定方法 • Oracle Universal Connection Pool • Oracle Data Provider for .NET • Oracle Call Interface Copyright © 2025, Oracle and/or its affiliates 116
  96. FANの設定 - データベース・サーバー側 データベース・サーバー側 (Oracle Grid Infrastructure) • ONSがFANイベントを配信するよう構成済み •

    UP/DOWNイベントは何も設定しなくとも生成される • データベース・サービスごとのランタイム接続ロード・バランスの設定 - RLBGOAL=SERVICE_TIME | THROUGHPUTに設定すると負荷配分比率イベントが生成される - ただしRCLBは使用しない方向に方針転換された アプリケーションからの接続用のデータベース・サービスを作成する • デフォルト・サービス(DB_UNIQUE_NAME/PDB_NAMEから派生)はアプリケーションからは接続してはいけない • FAN/ACは追加したサービスでのみ設定可能 アプリケーションからの接続用にデータベース・サービスを作成する $ srvctl add service -db DB_UNIQUE_NAME … -notification TRUE [-clbgoal LONG] [-rlbgoal NONE] RCLBは使用しない方向に方針転換されたのでデフォルトのまま 11g Release 2までのOCIクライアントのFAN対応 Copyright © 2025, Oracle and/or its affiliates 117
  97. Connection Pool データベース・コネクションを積極的に制御する2つの機能群 Oracleインスタンスの停止をアプリケーションからマスクする アプリケーション・サーバー Clusterware Clusterware FANイベント service service

    (Transparent) Application Continuity (透過的)アプリケーション・コンティニュイティ RACノード 1 RACノード n Fast Application Notification 高速アプリケーション通知 • 切断検出したら自動再実行 • (T)AC対応Oracle接続ドライバ • サーバー側のイベントをコネクション・プール に通知してコネクションを制御 • FAN対応コネクション・プール 停止 起動 計画停止(コマンドで停止) 非計画停止(異常終了) • 障害ノードとのコネクションを即時破棄 • コネクションがプールに返却されたら切断 非計画停止(異常終了) • 自動再接続&自動再実行 ※透過的アプリケーション・コンティニュイティ(TAC)とはアプ リケーション・コンティニュイティの動作モードの1つで、 19c以降ではほとんどの場合こちらを使用します Copyright © 2025, Oracle and/or its affiliates 118
  98. データベース・コネクションの積極的な制御 前半 データベースに接続する • データベース・サービス Fast Application Notification • サーバー側のイベントをクライアント側に通知

    • RAC接続ロード・バランスに関する推奨変更 Fast Application Notification - 計画停止 • サービス停止時の安全な切断 • サービス起動後の接続とリバランス Fast Application Notification - 非計画停止 • 異常切断の検出を早める 後半 Fast Application Notification - イベント配信経路 • 通信経路の冗長化 Application Continuity • 切断を検出すると自動再接続&自動再実行 • 自動再実行できないケース FAN/ACの設定 - データベース・クライアント側 • JDBC thin driver & UCP • Oracle Data Provider for .NET Oracleインスタンスの停止をアプリケーションからマスクする Copyright © 2025, Oracle and/or its affiliates 119
  99. Connection Pool データベース・コネクションを積極的に制御する2つの機能群 Oracleインスタンスの停止をアプリケーションからマスクする アプリケーション・サーバー Clusterware Clusterware FANイベント service service

    (Transparent) Application Continuity (透過的)アプリケーション・コンティニュイティ RACノード 1 RACノード n Fast Application Notification 高速アプリケーション通知 • 切断検出したら自動再実行 • (T)AC対応Oracle接続ドライバ • サーバー側のイベントをコネクション・プール に通知してコネクションを制御 • FAN対応コネクション・プール 停止 起動 計画停止(コマンドで停止) 非計画停止(異常終了) • 障害ノードとのコネクションを即時破棄 • コネクションがプールに返却されたら切断 非計画停止(異常終了) • 自動再接続&自動再実行 ※透過的アプリケーション・コンティニュイティ(TAC)とはアプ リケーション・コンティニュイティの動作モードの1つで、 19c以降ではほとんどの場合こちらを使用します Copyright © 2025, Oracle and/or its affiliates 121
  100. コネクションの異常切断からの自動再実行 コネクション切断を検出すると自動再実行 • 動作原理 リプレイ境界の概念 • 自動再実行する範囲 データベース・サーバー側の設定 • データベース・サービスの属性

    • 可変オブジェクト 注意を要するケース/自動再実行できないケース • 1つのデータベースに対し最後に1回だけCOMMITする一般的なオンライン・トランザクション処理ならコード変更なしで適用可能 データベース・クライアント側の設定 (→FANとまとめて最後に説明) • 接続ドライバの種類ごとに固有の設定方法 Application Continuity / アプリケーション・コンティニュイティ Copyright © 2025, Oracle and/or its affiliates 123
  101. アプリケーションはOracle接続ドライバを介してSQLを発行 アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL 3 SQL

    1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 Copyright © 2025, Oracle and/or its affiliates 125
  102. トランザクションの途中でOracleサーバーがクラッシュすると アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL 3 SQL

    1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 サーバーがクラッシュ トランザクションはロールバックされる Copyright © 2025, Oracle and/or its affiliates 126
  103. トランザクションは異常終了する トランザクションの途中でOracleサーバーがクラッシュすると アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL 3

    SQL 1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 サーバーがクラッシュ トランザクションはロールバックされる アプリケーションにはエラーが返る トランザクション異常終了 Copyright © 2025, Oracle and/or its affiliates 127
  104. セッションが切断されても自動再接続&更新トランザクション自動再実行 アプリケーション・コンティニュイティ アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL 3

    SQL 1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 SQL 1 SQL 2 SQL 3 Oracle接続ドライバのメモリー上にサーバーとの処理を記憶 Copyright © 2025, Oracle and/or its affiliates 128
  105. セッションが切断されても自動再接続&更新トランザクション自動再実行 アプリケーション・コンティニュイティ アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL 3

    SQL 1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 SQL 1 SQL 2 SQL 3 サーバーがクラッシュ トランザクションはロールバックされる Copyright © 2025, Oracle and/or its affiliates 129
  106. 再接続 セッションが切断されても自動再接続&更新トランザクション自動再実行 アプリケーション・コンティニュイティ アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL

    3 SQL 1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 1. 自動的に再接続 0. 切断を検出するとアプリケーション・コンティニュイティが発動 Copyright © 2025, Oracle and/or its affiliates 130
  107. 再接続 セッションが切断されても自動再接続&更新トランザクション自動再実行 アプリケーション・コンティニュイティ アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL

    3 SQL 1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 状態確認 1. 自動的に再接続 2. トランザクション状態を確認 Copyright © 2025, Oracle and/or its affiliates 131
  108. 再接続 セッションが切断されても自動再接続&更新トランザクション自動再実行 アプリケーション・コンティニュイティ アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL

    3 SQL 1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 SQL 1 SQL 2 SQL 3 状態確認 1. 自動的に再接続 2. トランザクション状態を確認 3. メモリー上に記憶していた処理を再実行 Copyright © 2025, Oracle and/or its affiliates 132
  109. 再接続 セッションが切断されても自動再接続&更新トランザクション自動再実行 アプリケーション・コンティニュイティ アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL

    3 SQL n SQL 1 SQL 2 SQL 3 SQL n Oracleサーバー SQL 1 SQL 2 SQL 3 SQL n SQL 1 SQL 2 SQL 3 状態確認 SQL n 4. 再実行完了するとアプリケーション・コードに復帰してトランザクション続行 Copyright © 2025, Oracle and/or its affiliates 133
  110. 再接続 セッションが切断されても自動再接続&更新トランザクション自動再実行 アプリケーション・コンティニュイティ アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL

    3 SQL n COMMIT SQL 1 SQL 2 SQL 3 SQL n COMMIT Oracleサーバー SQL 1 SQL 2 SQL 3 SQL n COMMIT SQL 1 SQL 2 SQL 3 状態確認 SQL n COMMIT 5. アプリケーションはエラーを観測せずにトランザクション完了 Copyright © 2025, Oracle and/or its affiliates 134
  111. 可変オブジェクト(Mutable Object) 読みだすたびに値が変化するオブジェクト • SYSDATE, SYSTIMESTAMP (現在時刻) • SYS_GUID (一意な識別子)

    • SEQUENCE.NEXTVAL (一意な数値) 再実行時に使用されるのは元の値 再実行時に値が変化するとORA-41412のエラー 再実行前の値が保存される設定が必要 KEEP属性の指定(後述) 読みだすたびに値が変化する可変オブジェクトの再実行時の扱いも自動対応 INSERT INTO tbl1 VALUES(SYSDATE); 障害検出 時間 時刻t0 時刻t1 COMMIT; INSERTされるべきは t0 or t1 ? ⇒ 元の時刻t0 INSERT INTO tbl1 VALUES(SYSDATE); ACで自動再実行 Copyright © 2025, Oracle and/or its affiliates 135
  112. 再実行前の値が保持されるのでトランザクションとして矛盾しない 可変オブジェクトのKEEP属性 SQL> INSERT INTO tbl1 VALUES(SYSDATE,1,seq1.NEXTVAL); 1行が作成されました。 SQL> SELECT

    * FROM tbl1; C1 C2 C3 ------------------- ---------- ---------- 2020/07/21 15:21:29 1 122 -- ALTER SYSTEM KILL SESSION SQL> SELECT * FROM tbl1; C1 C2 C3 ------------------- ---------- ---------- 2020/07/21 15:21:29 1 122 セッション切断 ACでINSERTが再実行されても 再実行前の値が保持されている SYSDATEとSEQUENCE.NEXTVALを INSERT INSERTされた値をSELECT (1) (2) (3) (4) セッション切断後にSELECT 同じ値 Copyright © 2025, Oracle and/or its affiliates 136
  113. アプリケーション・コンティニュイティの課題 再実行完了するまで待たされる • 応答時間要件が極めて短い場合はアプリケーション・コンティニュイティを使用しない選択肢も検討 • RACサーバー側での異常検出からの自動ロールバック • 接続ドライバ側での切断検出からの自動再接続&自動再実行 再実行できない処理パターンがある •

    1つのデータベースに対し最後に1回だけCOMMITする一般的なオンライン・トランザクション処理ならコード変更なしで適用可能 • 再実行できない処理にあたるとエラーを出し再実行されない • 再実行されないのでデータの状態はACがない場合と同じになる • 注意を要するパターン • 分散トランザクション(XA / Database Link) • 複数回COMMIT • データベース・サーバー外へのアクセス(ロールバックできない副作用処理) • 自律トランザクション(Autonomous Transaction) • 1トランザクション内で発行するSQLの数が極端に多い 適用しないほうがよい/できない場合がある Copyright © 2025, Oracle and/or its affiliates 137
  114. アプリケーション・コンティニュイティに必要なライセンス Oracle Database 19c Database ライセンス情報ユーザー・マニュアル https://docs.oracle.com/cd/F19136_01/dblic/Licensing-Information.html#GUID-0F9EB85D-4610-4EDF- 89C2-4916A0E7AC87__GUID-0E99AC20-9C6E-4E7B-B8CC-D36B0FABF533 RAC/RAC One

    NodeまたはActive Data Guardのライセンスが必要 機能/オプション/パック SE2 EE EE-ES BaseD B SE BaseD B EE BaseDB EE-HP BaseDB EE-EP ExaDB 注意事項 アプリケーション・コンティニュ イティ N Y Y N N N Y Y EEおよびEE-ES: Oracle Active Data Guardオプション、Oracle RAC One NodeオプションまたはOracle Real Application Clustersオプショ ンが必要 Oracle Cloud Infrastructure: オプション込み オンプレミス: 要オプション Copyright © 2025, Oracle and/or its affiliates 138
  115. 自動再実行する範囲 リプレイ境界の概念 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT アプリケーション・コード beginRequest() endRequest() • beginRequest() から endRequest() までが自動再実行する範囲→リプレイ境界 • Oracle製コネクション・プールを使用するとリプレイ境界APIの埋め込み不要 Copyright © 2025, Oracle and/or its affiliates 139
  116. ACを使用する場合も実質的にFAN対応コネクション・プールを使う Oracle製コネクション・プールはリプレイ境界処理を自動化する Application Server Connection Pool Application Server Connection Pool

    Javaアプリケーション・サーバー • JDBC Driver Java以外のアプリケーション・サーバー • Oracle Call Interface (OCI Session Pool) • Oracle Data Provider for .NET (ODP.NET) • コネクション・プール機能はアプリケーション・サーバーの役割 • UCPはリプレイ境界APIの埋め込みを不要にする • TACだとリプレイ境界APIの埋め込み不要な場合がある • コネクション・プール機能は接続ドライバの役割 • コネクション・プール機能はOracle接続ドライバと一体 • リプレイ境界処理APIの埋め込み不要 UCP ucp.jar JDBC Driver ojdbcn.jar コネクション・プール → FAN 接続ドライバ → (T)AC Copyright © 2025, Oracle and/or its affiliates 140
  117. JDBC thin driver & UCP (AC: 12c Release 1~) •

    AC: リプレイ・ドライバのクラス(新しいクラス)を指定 oracle.jdbc.replay.OracleDataSourceImpl • Universal Connection Pool(UCP)を使用するとリクエスト境界のAPI挿入のコード変更が不要 • 19cのTACではUCP無しでもリクエスト境界のAPI挿入不要 OCI Session Pool (AC: 12c Release 2~) • Pro*CとPro*COBOLはOCI Session Poolに対応していないのでACは使用できない • SQL*PlusはAC対応 Oracle Data Provider for .NET (AC: 12c Release 2~) • AC: 接続文字列 Application Continuity=true • 21cまで: Unmanaged DriverのみAC対応、Managed Driverと.NET Core Driverは非対応 • 23aiから: Unmanaged Driverは非推奨機能、Managed Driverと.NET Core DriverがAC対応した FAN&アプリケーション・コンティニュイティ対応クライアント Copyright © 2025, Oracle and/or its affiliates 141
  118. アプリケーション・コンティニュイティ アプリケーション・コンティニュイティ / Application Continuity (AC) • Oracle Database 12c

    Release 1~ • リプレイ境界の制御が必要(Oracle製コネクション・プールなら不要) 透過的アプリケーション・コンティニュイティ / Transparent Application Continuity (TAC) • Oracle Database 18c ~(実質的には19c以降) • リプレイ境界を自動挿入するので複数回COMMITに対応できるケースがある • サード・パーティ製Javaアプリケーション・サーバーのコネクション・プールでもコード修正なしに使用可能な場合がある(19c~) 2種類の動作モード 再実行可否のデフォルト設定 処理対象 AC TAC 副作用を持つプロシージャ Y N 自律トランザクション Y N データベース・リンク(RU19.27~) Y N • N: その処理を通過しようとしたときエラーとなり自動再実行されない • RU19.27から個別に動作を設定可能なプロシージャが実装された Copyright © 2025, Oracle and/or its affiliates 143
  119. アプリケーション・コンティニュイティはデータベース・サービスの属性 AC/TACはsrvctlコマンドでサービスの属性として設定 -failovertype -failover_restore -commit_outcome Oracleクライアントは サービス名を指定して接続 SERVICE_NAME=service_A Oracleクライアント RAC

    service_A AC/TACはサービスの属性 srvctl modify service ... -failovertype AUTO -failover_restore AUTO -commit_outcome TRUE -replay_init_time 60 -retention 86400 Copyright © 2025, Oracle and/or its affiliates 144
  120. failovertype属性 アプリケーション・コンティニュイティはデータベース・サービスの属性 -failovertype セッション・フェイルオーバー機能 SESSION (8~) 透過的アプリケーション・フェイルオーバー(要OCIクライアント) セッション再接続 SELECT (8~)

    透過的アプリケーション・フェイルオーバー(要OCIクライアント) SELECT文自動再実行 TRANSACTION (12c Release 1~) アプリケーション・コンティニュイティ 更新トランザクション自動再実行 AUTO (18c~) 透過的アプリケーション・コンティニュイティ 更新トランザクション自動再実行 Oracle8から存在する透過的アプリケーション・フェイルオーバー(Transparent Application Failover: TAF)機能もサービスの属性として設定可能 • TAFはOCIの機能なのでJDBC thinドライバでは使用できない • TAFはトランザクションの中にひとつでも更新処理があるとエラーになるのでSELECT文しか対応できない • AC/TACは更新トランザクションを再実行可能。 srvctl add|modify service ... -failovertype SESSION | SELECT | TRANSACTION | AUTO Copyright © 2025, Oracle and/or its affiliates 145
  121. セッション状態の復元 • サービスの属性でTAC(-failovertype AUTO)を設定すると自動的にセッション状態復元(-failover_restore AUTO)が設定される • AC (-failovertype TRANSACTION)の場合は明示的に-failover_restore LEVEL1を指定する

    • 復元される項目のリストは使用するバージョンのマニュアル「 Real Application Clusters管理およびデプロイメント・ガイド」を参照のこと ALTER SESSIONなどによる非トランザクショナルな変更の復元 nls_nchar_conv_excp nls_calendar nls_comp nls_currency nls_date_format nls_date_language nls_dual_currency nls_iso_currency nls_language nls_length_semantics nls_numeric_characters nls_sort nls_territory nls_time_format nls_time_tz_format nls_timestamp_format nls_timestamp_tz_format allow_rowid_column_type approx_for_aggregation approx_for_count_distinct approx_for_percentile cursor_sharing default_collation optimizer_capture_sql_plan_baselines srvctl add|modify service ... -failover_restore NONE | LEVEL1 | AUTO optimizer_ignore_hints optimizer_ignore_parallel_hint optimizer_use_sql_plan_baselines parallel_degree_limit parallel_degree_policy parallel_min_time_threshold plscope_settings plsql_ccflags plsql_debug plsql_optimize_level plsql_warnings recyclebin result_cache_mode Copyright © 2025, Oracle and/or its affiliates 146
  122. 再接続 自動再接続したときに自動再実行の可否を判定 トランザクション状態確認機能(トランザクション・ガード) アプリケーション Oracle接続ドライバ SQL 1 SQL 2 SQL

    3 SQL 1 SQL 2 SQL 3 Oracleサーバー SQL 1 SQL 2 SQL 3 状態確認 1. 自動的に再接続 2. トランザクション状態を確認 Transaction Guard/トランザクション・ガード • Oracle Database 12c Release 1~ • アプリケーション・コンティニュイティのために実装された • 論理トランザクションIDを指定して問い合わせるとトラ ンザクション状態を返す Copyright © 2025, Oracle and/or its affiliates 147
  123. トランザクション状態確認機能(トランザクション・ガード)の有効化 データベース・ユーザーに権限付与 サービスの属性 -commit_outcome TRUE データベース・ユーザーの権限とサービスの属性 SQL> GRANT EXECUTE ON

    DBMS_APP_CONT TO user; srvctl modify service ... -failovertype AUTO -failover_restore AUTO -commit_outcome TRUE -replay_init_time 60 -retention 86400 Copyright © 2025, Oracle and/or its affiliates 148
  124. Oracle Autonomous Database • Oracle Autonomous DatabaseはExadataを基盤としており、つまりEnterprise Edition RAC •

    アプリケーション・コンティニュイティに対応しているが、srvctlコマンド操作ができない • アプリケーション・コンティニュイティ関連の設定プロシージャが用意されているのでそれらで設定する OSコマンド(srvctl)操作ができないのでAC/TAC設定用のプロシージャが用意されている execute DBMS_APP_CONT_ADMIN.ENABLE_AC( 'databaseid_tpurgent.adb.oraclecloud.com', 'LEVEL1', 600); execute DBMS_APP_CONT_ADMIN.ENABLE_TAC( 'databaseid_high.adb.oraclecloud.com', 'AUTO', 1200); 動作モード 設定プロシージャ AC DBMS_APP_CONT_ADMIN.ENABLE_AC() TAC DBMS_APP_CONT_ADMIN.ENABLE_TAC() ※Dedicated InfrastructureではTP, TP_TLS, TPURGENT, TPURGENT_TLSのサービスはデフォルトでTACが有効 Copyright © 2025, Oracle and/or its affiliates 149
  125. アプリケーション・コンティニュイティのサービス設定確認 サービスに関するデータ・ディクショナリ・ビュー DBA_SERVICES(ALL_SERVICES, CDB_SERVICES) • FAILOVER_TYPE TAF/AC/TACのモード • COMMIT_OUTCOME トランザクション・ガード

    SQL> select name, failover_type, commit_outcome from dba_services; NAME FAILOVER_TYPE COMMIT_OUTCOME -------------------- -------------------- -------------------- SIPDB19A1 NO pdba1svc1 NO pdba1svc2ac TRANSACTION YES pdba1svc3tac AUTO YES Copyright © 2025, Oracle and/or its affiliates 150
  126. 可変オブジェクト(Mutable Object) 読みだすたびに値が変化するオブジェクト • SYSDATE, SYSTIMESTAMP (現在時刻) • SYS_GUID (一意な識別子)

    • SEQUENCE.NEXTVAL (一意な数値) 再実行時に使用されるのは元の値 再実行時に値が変化するとORA-41412のエラー 再実行前の値が保存される設定が必要 KEEP属性の指定 読みだすたびに値が変化する可変オブジェクトの再実行時の扱いも自動対応 INSERT INTO tbl1 VALUES(SYSDATE); 障害検出 時間 時刻t0 時刻t1 COMMIT; INSERTされるべきは t0 or t1 ? ⇒ 元の時刻t0 INSERT INTO tbl1 VALUES(SYSDATE); ACで自動再実行 Copyright © 2025, Oracle and/or its affiliates 151
  127. 可変オブジェクトのKEEP属性の設定 -- SEQUENCE所有ユーザー SQL> ALTER SEQUENCE sequence_object KEEP; -- 管理者ユーザー

    SQL> GRANT KEEP DATE TIME TO user; SQL> GRANT KEEP SYSGUID TO user; SQL> GRANT KEEP SEQUENCE on owner.sequence_object TO user; 可変オブジェクトごとに、ACで再実行前の値を保存するKEEP属性がある Copyright © 2025, Oracle and/or its affiliates 152
  128. 一般的なオンライン・トランザクション処理ならコード変更不要 アプリケーション・コンティニュイティ Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT アプリケーション・コード beginRequest() → Oracle製コネクション・プールなら不要 endRequest() → Oracle製コネクション・プールなら不要 一般的なオンライン・トランザクション処理 • ロールバック可能な処理 • 最後に1回だけCOMMIT コード変更不要で(T)AC適用可能 Copyright © 2025, Oracle and/or its affiliates 153
  129. 注意を要するケース 副作用のある処理 • DBMS外部に対し副作用を持つプロシージャ • 自律トランザクション(Autonomous Transaction) • データベース・リンク(Oracle Database

    19c RU19.27~) • RU19.27以降では上記の再実行可否を個別に指定できるようになった アプリケーション・コンティニュイティで再実行できないケース 再実行可否のデフォルト設定 処理対象 AC TAC 副作用を持つプロシージャ Y N 自律トランザクション Y N データベース・リンク(RU19.27~) Y N • N: その処理を通過しようとしたときエラーとなり自動再実行されない • RU19.27から個別に動作を設定可能なプロシージャが実装された Copyright © 2025, Oracle and/or its affiliates 154
  130. RU19.27から副作用のある処理の自動再実行可否を個別に設定可能 PL/SQL DBMS_APP_CONT_ADMINパッケージに設定プロシージャを追加 DBMS_APP_CONT_ADMIN.SET_REPLAY_RULES ( service_name IN VARCHAR2 DEFAULT NULL

    replayable IN BOOLEAN, targets IN BINARY_INTEGER); targetsに定数を与えることで設定対象機能を指定 • dbms_app_cont_admin.side_effects • dbms_app_cont_admin.autonomous_transactions • dbms_app_cont_admin.database_links replayable 再実行可否のデフォルト設定 処理対象 AC (TRANSACTION) TAC (AUTO) 副作用を持つプロシージャ true false 自律トランザクション true false データベース・リンク true false Copyright © 2025, Oracle and/or its affiliates 155
  131. 注意を要するケース: 自律トランザクション(Autonomous Transaction) • 自律トランザクション内でCOMMITされた変更は確定しているがACは再実行する/TACは再実行しない • RU19.27から自動再実行可否を指定可能 トランザクション内に入れ子になったトランザクション CREATE PROCEDURE

    dosomething (...) IS BEGIN autonomousprocedure(...) INSERT INTO tbl1 ... END; / CREATE PROCEDURE autonomousprocedure (...) IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO tbl2 ... COMMIT; -- このプロシージャ内でのみ完結 END; / アプリケーション・ロジックのプロシージャ ロギング用自律トランザクションのプロシージャ アプリケーション・ロジックのプロシージャはROLLBACKされて再 実行される 自律トランザクションでCOMMITされた更新はそのままで再実行される Copyright © 2025, Oracle and/or its affiliates 157
  132. RU19.27から再実行可能 注意を要するケース: データベース・リンク DB-A DB-B Service-A Service-B データベース・クライアント データベース・リンク アプリケーション・コンティニュイティ

    • デフォルトでは再実行される 透過的アプリケーション・コンティニュイティ • デフォルトでは再実行されない RU19.27から自動再実行可否を指定可能 Copyright © 2025, Oracle and/or its affiliates 158
  133. RU19.27から再実行可能 注意を要するケース: データベース・リンク DB-A DB-B Service-A Service-B データベース・クライアント データベース・リンク XAで分散トランザクション

    ※ JDBC replay XAドライバがAC対応と言っているのは 1つのデータベースのみのトランザクションの場合 DB-A DB-B Service-A Service-B データベース・クライアント データベース・リンク (RU19.27から可能) ※ データベース・リンクは内部的には分散トランザクション Copyright © 2025, Oracle and/or its affiliates 159
  134. エラー・コードから見る制限事項 Oracle Database 19c Database エラー・メッセージ https://docs.oracle.com/cd/F19136_01/errmg/ORA-41001.html#GUID-658C153A-91D4-42B9-85D8- E500A7155A33 ORA-41408: 最後のコールにCOMMITが埋め込まれていました。フェイルオーバーを続行できません

    ORA-41409: コミットされたトランザクションを再実行できません。フェイルオーバーを続行できません ORA-41410: コールによりトランザクションがコミットされ、新しいトランザクションが開始されました。フェイルオーバーを続行できません ORA-41411: リクエスト内のラウンド・トリップが多すぎます。再実行が無効化されました ORA-41412: 再実行中に結果が変更されました。フェイルオーバーを続行できません ORA-41413: コール取得内のデータが多すぎます。再実行が無効化されました ORA-41425: リプレイは、トランザクション処理モニター(TPM)によって管理された2フェーズ・コミット(2PC)を使用したグローバル・トラン ザクションに対して無効です ORA-41429: 失敗した接続で再実行できない副次的作用 ORA-41431: アプリケーション・コンティニュイティでは、ISOLATION_LEVEL=SERIALIZABLEはサポートされません。フェイルオー バーを続行できません。 Copyright © 2025, Oracle and/or its affiliates 160
  135. Java 以下の具象クラスはJDBC Driver 12.2まではACをサポートしていない。18cからサポートされた。 一般的にはSQL用のデータ型にはjava.sql.*のクラスが使用されるので、これらのoracle.sqlパッケージの具象クラスが使用されている ことはほとんどないはず。 • oracle.sql.CLOB • oracle.sql.NCLOB

    • oracle.sql.BLOB • oracle.sql.BFILE • oracle.sql.STRUCT • oracle.sql.REF • oracle.sql.ARRAY アプリケーション・コンティニュイティに対応していないクラスが一部ある Copyright © 2025, Oracle and/or its affiliates 161
  136. 再実行できないケース: PL/SQL内で複数回COMMIT ORA-41408 PL/SQL内で複数回COMMITしているケース • 再接続するとCOMMIT完了したところまでは確定してしまっているためPL/SQLプログラムの先頭から再実行できない バッチ処理にあり得るケース CREATE PROCEDURE multicommit

    (...) IS BEGIN FOR i IN 1..itelation LOOP INSERT INTO ... ; COMMIT; END LOOP; END; / COMMITが複数 回発行される ORA-41408: 最後のコールにCOMMITが埋め込まれていまし た。フェイルオーバーを続行できません COMMIT COMMIT COMMIT END BEGIN COMMITされたところまでは確 定しているので全体を再実行で きない Copyright © 2025, Oracle and/or its affiliates 162
  137. 再実行できないケース: 複数回COMMIT ORA-41409 1リクエスト境界内でクライアントから複数回COMMITしているケース (サービス属性FAILOVERTYPE=TRANSACTION) • AC/アプリケーション・コンティニュイティで再実行できない • 再接続するとCOMMIT完了したところまでは確定してしまっているため全体を再実行できない バッチ処理にあり得るケース

    SQL> INSERT INTO tbl1 VALUES(SYSDATE,1,seq1.nextval); SQL> COMMIT; SQL> INSERT INTO tbl1 VALUES(SYSDATE,1,seq1.nextval); SQL> SELECT * FROM tbl1; SELECT * FROM tbl1 * 行1でエラーが発生しました。: ORA-41409: コミットされたトランザクションを再実行できません。フェイルオーバーを続行できません ここでセッション切断 セッション切断後にSQL発行 COMMIT後にDML発行 Copyright © 2025, Oracle and/or its affiliates 163
  138. 再実行できないケース: 複数回COMMIT ORA-41409 → TACなら再実行可能 1リクエスト境界内でクライアントから複数回COMMITしているケース (サービス属性FAILOVERTYPE=TRANSACTION) • COMMIT後にDMLを発行してもトランザクションを継続可能 •

    TAC/透過的アプリケーション・コンティニュイティはリプレイ境界を自動挿入する バッチ処理にあり得るケース SQL> INSERT INTO tbl1 VALUES(SYSDATE,1,seq1.nextval); SQL> COMMIT; SQL> INSERT INTO tbl1 VALUES(SYSDATE,1,seq1.nextval); SQL> SELECT * FROM tbl1; C1 C2 C3 -------- ---------- ---------- 25-03-26 1 4 25-03-26 1 24 ここでセッション切断 セッション切断後にSQL発行→トランザクション継続 COMMIT後にDML発行 Copyright © 2025, Oracle and/or its affiliates 164
  139. 再実行できないケース: (OCIクライアントのみ)コール回数が多い ORA-25420 アプリケーション・コンティニュイティ対応のOracle接続ドライバはOracleサーバーに発行した処理を記憶している • OCIクライアント(OCI Session PoolとODP.Net Unmanaged Driver)はメモリ枯渇が発生しないように1リクエスト境界中

    に発行できる処理数に上限が設けられている • これを超えてアプリケーション・コンティニュイティが発動するとORA-25420になる • バッチ処理などで大量のSQLを発行している場合やSELECT文が大量の行を返す場合にこれに抵触することがある 対処策 • アプリケーション・ロジックをストアド・プロシージャ化する (接続ドライバからのcall回数が減る) • SELECT文が多数の行を返す場合にarray fetchのサイズを大きくする (FETCHのcall回数が減る) • OCIクライアント側もRU19.11以降を適用する → SQLコール回数上限のパラメータ指定が可能になる 1リクエスト境界中の処理発行数に上限がある Copyright © 2025, Oracle and/or its affiliates 165
  140. 再実行できないケース: (Java)コール回数が多い OutOfMemoryError アプリケーション・コンティニュイティ対応のOracle接続ドライバはOracleサーバーに発行した処理を記憶している • Javaの場合、 SQLコール数制限に抵触するORA-25420のエラーとはならないが、JVMのメモリーが枯渇すると OutOfMemoryErrorとなる 対処策 •

    アプリケーション・ロジックをストアド・プロシージャ化する (接続ドライバからのcall回数が減る) • SELECT文が多数の行を返す場合にarray fetchのサイズを大きくする (FETCHのcall回数が減る) • JVMのメモリー指定を大きくする 1リクエスト境界中の処理発行数に上限がある Copyright © 2025, Oracle and/or its affiliates 166
  141. (T)ACはデータベース・サービスごとの設定 アプリケーションごとに挙動を変えたい場合はサービスを区別する tnslsnr データベース service2 Application1 Application2 user1/password1@host1:port1/service1 user1/password1@host1:port1/service2 user1

    host1:port1 同じデータベース・ユーザーへの接続でも アプリケーションごとにサービスを区別 service1 データベース・クライアント (T)ACの挙動を区別できる データベース・サーバー Copyright © 2025, Oracle and/or its affiliates 167
  142. FAN/ACの設定 - データベース・クライアント側 アプリケーション・コンティニュイティを使用する場合もFAN対応コネクション・プールと組み合わせる • JDBC thin driver & Universal

    Connection Pool • Oracle Data Provider for .NET • Oracle Call Interface 接続ドライバごとの固有の設定 Copyright © 2025, Oracle and/or its affiliates 169
  143. 言語によって事情が異なる - JavaとJava以外に分かれる コネクション・プール機能はどの階層の持ち物か Application Server Connection Pool Application Server

    Connection Pool Javaアプリケーション・サーバー • JDBC Driver Java以外のアプリケーション・サーバー • Oracle Call Interface (OCI Session Pool) • Oracle Data Provider for .NET (ODP.NET) • コネクション・プール機能はアプリケーション・サーバーの役割 • Universal Connection Pool (UCP)を別途提供 • UCPを組み込むことをサポートしているか • コネクション・プール機能は接続ドライバの役割 • コネクション・プール機能はOracle接続ドライバと一体 UCP ucp.jar JDBC Driver ojdbcn.jar コネクション・プール → FAN 接続ドライバ → (T)AC Copyright © 2025, Oracle and/or its affiliates 171
  144. Oracle Universal Connection Pool (UCP) UCPでFANを使用するには少なくとも3つのJARファイルをclasspathに含む必要がある • ojdbcn.jar (JDBCドライバ: 対応JDKとJDBC

    APIバージョンによってnが異なる) • ucp.jar (Universal Connection Pool) • ons.jar (FAN通信に必要) Oracle Database Server/ClientのORACLE_HOMEディレクトリに含まれている • Release Updateパッチを適用すると各JARファイルのRUバージョンも上がる(最新のRUを推奨) • $ORACLE_HOME/jdbc/lib/ojdbcn.jar • $ORACLE_HOME/ucp/lib/ucp.jar • $ORACLE_HOME/opmn/lib/ons.jar JDBCドライバのダウンロード・ページからも入手可能 • https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html • ほぼ最新のRUのJARファイルを入手可能 FAN対応コネクション・プール Copyright © 2025, Oracle and/or its affiliates 172
  145. Oracle WebLogic Server UCPが組み込まれている データソースの種類 FAN対応 AC対応 補足 Generic Data

    Source N Y GridLink Data Source (Multi Data Source) N N 複数のデータソースを1つに束ねる UCP Data Source Y Y UCPをそのまま使う Standard Editionでも使用可能 Active GridLink Data Source Y Y UCPをWebLogicの機能と統合 Suiteのライセンスが必要 Copyright © 2025, Oracle and/or its affiliates 175
  146. 商用Javaアプリケーション・サーバーにUCPを組み込む 公開情報が見つけられない場合はUCPを組み込むことを認めていない場合があるので可否をアプリケーション・サーバー提供元に要確認 × Oracle UCPをサポートしますか? → いいえ、UCPに関するご質問はOracle社にお問い合わせください ◦ Oracle UCPを組み込んで使用することは可能ですか?

    IBM WebSphere Application Server https://www.ibm.com/support/pages/enabling-oracle-universal-connection-pooling-ucp-websphere-application-server RedHat JBoss Enterprise Application Platform https://developers.redhat.com/blog/2020/12/07/use-oracles-universal-connection-pool-with-red-hat-jboss-enterprise-application-platform-7- 3-and-oracle-rac#integrating_universal_connection_pool_with_an_oracle_rac_database NEC WebOTX Application Server https://jpn.nec.com/webotx/appserver/product/env101share/db_java_v101.html FUJITSU Interstage Application Server https://software.fujitsu.com/jp/manual/manualfiles/m230004/b1ws1418/04z200/b1418-f-02-00.html アプリケーション・サーバー提供元の情報を参照 Copyright © 2025, Oracle and/or its affiliates 176
  147. InterfaceはJDBC規格で統一されているので技術的には可能 Javaアプリケーション・サーバーにUCPを組み込む Application Server UCP コネクション・プール → FAN 接続ドライバ →

    (T)AC DataSource Interface javax.sql.DataSource javax.sql.DataSource ds=(javax.sql.DataSource)envContext.lookup ("tomcat/UCPPool"); Connection conn = ds.getConnection(); //論理コネクションをプールから取得 : conn.close(); // 論理コネクションをプールに返却 アプリケーション・コードはごく一般的なJDBCプログラミング データソースを名前で検索 Copyright © 2025, Oracle and/or its affiliates 177
  148. InterfaceはJDBC規格で統一されているので技術的には可能 Javaアプリケーション・サーバーにUCPを組み込む Application Server UCP コネクション・プール → FAN 接続ドライバ →

    (T)AC DataSource Interface javax.sql.DataSource name="tomcat/UCPPool" type="oracle.ucp.jdbc.PoolDataSource“ factory="oracle.ucp.jdbc.PoolDataSourceImpl" connectionFactoryClassName="oracle.jdbc.replay.OracleDataSourceImpl” user=… password=… url=… UCP固有のパラメータ=… データソース設定ファイルでUCP実装クラスを指定 (アプリケーション・サーバーごとに標準的な書き方がある) javax.sql.DataSource ds=(javax.sql.DataSource)envContext.lookup ("tomcat/UCPPool"); Connection conn = ds.getConnection(); //論理コネクションをプールから取得 : conn.close(); // 論理コネクションをプールに返却 アプリケーション・コードはごく一般的なJDBCプログラミング UCP実装クラス データベース接続 パラメータ データソースを名前で検索 Copyright © 2025, Oracle and/or its affiliates 178
  149. InterfaceはJDBC規格で統一されているので技術的には可能 Javaアプリケーション・サーバーにUCPを組み込む Application Server UCP コネクション・プール → FAN 接続ドライバ →

    (T)AC DataSource Interface javax.sql.DataSource name="tomcat/UCPPool" type="oracle.ucp.jdbc.PoolDataSource“ factory="oracle.ucp.jdbc.PoolDataSourceImpl" connectionFactoryClassName="oracle.jdbc.replay.OracleDataSourceImpl” user=… password=… url=… UCP固有のパラメータ=… データソース設定ファイルでUCP実装クラスを指定 (アプリケーション・サーバーごとに標準的な書き方がある) javax.sql.DataSource ds=(javax.sql.DataSource)envContext.lookup ("tomcat/UCPPool"); Connection conn = ds.getConnection(); //論理コネクションをプールから取得 : conn.close(); // 論理コネクションをプールに返却 アプリケーション・コードはごく一般的なJDBCプログラミング UCP実装クラス データベース接続 パラメータ Interface oracle.ucp.jdbc.PoolDataSource setXX() Copyright © 2025, Oracle and/or its affiliates 179
  150. UCPのパラメータ一覧 Interface oracle.ucp.jdbc.PoolDataSource のset/getメソッド Oracle Databaseマニュアル・セットの中にUCPのjavadocがある Oracle Database 19c UCP

    for JDBC Java API Reference https://docs.oracle.com/en/database/oracle/oracle-database/19/jjuar/oracle/ucp/jdbc/PoolDataSource.html Copyright © 2025, Oracle and/or its affiliates 180
  151. UCPのFAN/AC設定 FAN/ACに関するパラメータ Interface oracle.ucp.jdbc.PoolDataSource パラメータ 説明 connectionFactoryClassName 個々のコネクションを作成するクラス名 ※1 AC非対応:

    oracle.jdbc.pool.OracleDataSource AC対応: oracle.jdbc.replay.OracleDataSourceImpl fastConnectionFailoverEnabled FAN全機能のスイッチ (FANにはons.jarが必要) ※2 true/false ONSConfiguration 明示的にONS接続先を設定する場合に指定 ※3 例: "nodes=racnode1:6200,racnode2:6200" ※1 oracle.jdbc.pool.OracleDataSource は11g Release 2以前からあるクラス oracle.jdbc.replay.OracleDataSourceImpl は12c Release 1で追加されたAC対応クラス/19cからTACも対応 ※2 FAN機能が最初に実装されたのは10g Release 1でUP/DOWNイベントに対応するFCFのみで、このときはFANとは言っていなかった パラメータ名からはFCF機能のスイッチに見えるが、FAN全機能のスイッチ ※3 12c Release 1からはONS接続先を明示的に設定しないとデータベース接続文字列から接続先を推定し、これが現在の標準の方法 Copyright © 2025, Oracle and/or its affiliates 181
  152. UCPのコネクション本数設定 コネクション本数に関するパラメータ 物理コネクションに寿命を持たせるパラメータ(リバランスのため) Interface oracle.ucp.jdbc.PoolDataSource パラメータ デフォルト値 説明 initialPoolSize 0

    物理コネクションの初期本数 minPoolSize 0 物理コネクションの最小本数 minを下回ったらminを満たすように物理コネクションを作成する maxPoolSize Integer.MAX_VALUE 物理コネクションの最大本数 maxのときにUPイベントが来たら何本か切断して物理コネクションを作成する パラメータ デフォルト値 説明 maxConnectionReuseCount 0 (無効) 物理コネクションを論理コネクションとして指定回数貸し出したら切断 maxConnectionReuseTime 0 (無効) 物理コネクションが指定した秒数存在したら切断 よくある設定は initial = min = max Copyright © 2025, Oracle and/or its affiliates 182
  153. Oracle Data Provider for .NET (ODP.NET) • 21cまでは(Transparent) Application Continuityを使用するためにはUnmanaged

    Driverが必要 • 23aiではManaged Driverで(T)ACを使用できるようになり、Unmanaged Driverは非推奨(将来廃止予定) 接続ドライバが3種類ある ドライバの種類 ODP.NET 19c ODP.NET 23ai FAN (T)AC FAN (T)AC Core (コア) Y ※1 N Y Y Managed (管理対象) Y ※1 N Y Y Unmanaged (管理対象外) Y ※2 Y Unmanaged Driverは非推奨機能 in-band FAN対応がRUで追加された ※1 RU19.9 ※2 RU19.10 Copyright © 2025, Oracle and/or its affiliates 185
  154. ODP.NETのFAN/AC設定 接続文字列のパラメータで制御 もしFANコネクションの接続先を明示的に設定する場合 パラメータ デフォルト値 説明 Pooling true コネクション・プール有効化 HA

    Events true FAN DOWNイベントによるFCF対応 Load Balancing true FAN 負荷配分比率イベントによるRCLB対応 Application Continuity true (Transparent) Application Continuity対応 ODP.NETドライバ・タイプ FANインフラストラクチャ 構成 手動ONS構成の場所 コアおよび管理対象 ONS 自動または手動 次の2つのファイルのいずれか •.NET構成ファイル •ONS構成ファイル 管理対象外 ONS 自動または手動 oraaccess.xmlファイル Oracle Data Provider for .NET 開発者ガイド https://docs.oracle.com/cd/G11854_01/odpnt/featRAC.html#GUID-3A7979D7-4AD3-4846-ADC8-A141DA089C8A Copyright © 2025, Oracle and/or its affiliates 186
  155. ODP.NETのコネクション・プール本数に関するパラメータ 接続文字列のパラメータで制御 物理コネクションに寿命を持たせる(リバランスのため) パラメータ デフォルト値 説明 Max Pool Size 100

    プール内の接続の最大数 Min Pool Size 1 プール内の接続の最小数 Incr Pool Size 5 プール内のすべての接続が使用された場合に作成される新しい接続の数 Decr Pool Size 1 未使用の確立済接続量が過剰となり、クローズされる接続数 パラメータ デフォルト値 説明 Connection Lifetime 0 接続の最小存続時間(秒) ODP.NETの接続文字列のパラメータ一覧 Oracle Data Provider for .NET 開発者ガイド 19c 3 Oracle Data Provider for .NETの機能 Oracle Databaseへの接続 Copyright © 2025, Oracle and/or its affiliates 187
  156. Connection Pool データベース・コネクションを積極的に制御する2つの機能群 Oracleインスタンスの停止をアプリケーションからマスクする アプリケーション・サーバー Clusterware Clusterware FANイベント service service

    (Transparent) Application Continuity (透過的)アプリケーション・コンティニュイティ RACノード 1 RACノード n Fast Application Notification 高速アプリケーション通知 • 切断検出したら自動再実行 • (T)AC対応Oracle接続ドライバ • サーバー側のイベントをコネクション・プール に通知してコネクションを制御 • FAN対応コネクション・プール 停止 起動 計画停止(コマンドで停止) 非計画停止(異常終了) • 障害ノードとのコネクションを即時破棄 • コネクションがプールに返却されたら切断 非計画停止(異常終了) • 自動再接続&自動再実行 ※透過的アプリケーション・コンティニュイティ(TAC)とはアプ リケーション・コンティニュイティの動作モードの1つで、 19c以降ではほとんどの場合こちらを使用します Copyright © 2025, Oracle and/or its affiliates 189
  157. Oracleインスタンスの停止をアプリケーションからマスクする アプリケーションから見たFANとACの動作 Connection Pool Connection Pool getConnection() close() SQL 1

    SQL n COMMIT アプリケーション・コード 計画停止(コマンドで停止) 非計画停止(異常終了) 論理コネクション取得 論理コネクション返却→切断 Fast Application Notification • サービス停止しても処理継続 • 処理内容は関係ない 論理コネクション取得 論理コネクション返却 Fast Application Notification • 切断検出を早める Application Continuity • 自動再接続&自動再実行 • 自動再実行できない処理がある • FANでコネクション切断の制御 • 論理コネクションを返却して切断 • FANで異常切断検出を早める • 切断検出したらACで再実行 • 物理コネクションを切断してから Oracleインスタンス停止 Copyright © 2025, Oracle and/or its affiliates 190