データ・ソース構成
構成概要
WebLogicサーバ・インスタンスとOracle DBの通信は常設のDBコネクション、いわゆるコネクション・プーリングを通して行われます。この接続を定義するデータ・ソースのタイプは主に「汎用データ・ソース」、「マルチ・データ・ソース」、「Active GlidLink(AGL)」の3タイプ、他に「UCPデータ・ソース(UCP:Oracle Universal Connection Pooling)」なんてのもありますがこれはWebLogicではほとんど使用されていないと思います。今回使用するのも先に挙げた3タイプのデータ・ソースでざっくり特徴を説明するとこんな感じです。
【WebLogicデータソース・タイプ】
データソース・タイプ | 説明 |
汎用データ・ソース | シングル構成やH/A構成のDB接続に使用。複数インスタンス(RAC構成)を対象とした フェイルオーバー、接続ロードバランシング設定可能。 FCF(高速アプリケーション通知)使用不可 |
マルチデータ・ソース | 汎用データソースを束ねて論理的に一つのデータソースを構成。 データソース(通常タイプ)の機能に加え汎用データソース間でラウンドロビンによるリクエスト投入先DBインスタンスの振り分けが可能。 FCF使用不可 |
Active GridLink | DBインスタンスの負荷状況に応じてリクエスト投入先を分散するランタイム・ロードバランシング、FCFによる高速フェイルオーバーを設定可能 |
機能面で言えばActive GridLink一択ですが、これがちょっとお高くて使用できるライセンスはEnterprise Edition以上(WebLogic Server Enterprise EditionまたはWebLogic Suite)となっており、どのデータソースを使うかはロードバランシングやフェイルオーバーの要件と費用のご相談というところです。
一口にロードバランシングといってもDB接続時のバランシング、コネクション・プーリングを介したリクエストの投入先のバランシングがあり、後者についてはラウンドロビンによる静的ロードバランシングとDBインスタンスの負荷状況に応じてリクエストの投入先を振り分ける、いわゆるランタイム・ロードバランシングがあります。また、フェイルオーバーについても通常のフェイルオーバーの他、ONSの高速アプリケーション通知によって障害発生から短時間で接続切り替えを行う高速接続フェイルオーバー(Fast Connection Failover: FCF)があります。
こうした機能の使用にはサーバサード、クライアントサイドでそれぞれの設定があり、マニュアルを読んでも(私にとっては)正直ちょっとややこしいところです。なのでとりあえずAPサーバ#1にマルチデータ・ソース、APサーバ#2にActive GlidLink の2パターンでデータ・ソースを定義していくつか簡単なテストケースでもって機能面のざっくりした比較をやってみたいと思います。
マルチ・データ・ソースはDBサーバ#1(インスタンスprdb1)、DBサーバ#2(インスタンスprdb2)のPDBにそれぞれ100本、Active GlidLinkはDBサーバ#1、DBサーバ#2で合計200本(DB接続時の負荷状況により変動)のコネクションを張ってリクエストを振り分けます。
データ・ソースの障害運用はマルチ・データ・ソースの場合、そのノードへの振り分けを停止して残ったノードの接続だけを使用した縮退運用、Active GlidLinkの場合は高速フェイルオーバー(FCF)です。
マルチ・データ・ソースでも汎用データ・ソース側にフェイルオーバーを設定すればActive GlidLinkと同じような動きになりますが、この設定では接続の不整合や遅延、リトライによるタイムアウト延伸といった問題があるようなのでこれはやらない方が無難です。
なお、DBの接続サービスにはonline_srv(サービス作成手順はこちら)を使用します。

事前準備
ファイアウォール設定
現在、DBサーバのファイアウォールはDBサーバ間の接続しか許可していません。このままではAPサーバからDBに接続できないのでOracle Net接続およびONSへの接続を許可します。
【prsdb01、prsdb02、prsdb03 / rootユーザで実行】
-----------------------------------------------------------------------------
# firewalldの現在の設定を確認
firewall-cmd --list-all
# APサーバからのOracle Net、ONSへのアクセスを許可(firewall-cmd~--permanentまで1行で記述)
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.51" port port="1521" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.51" port port="6200" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.52" port port="1521" protocol="tcp" accept' --permanent
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.30.52" port port="6200" protocol="tcp" accept' --permanent
# 設定をリロード
firewall-cmd --reload
# 最新の設定を確認
firewall-cmd --list-all
CRS、DBインスタンス、PDB、サービス起動
DBサーバ#1、DBサーバ#2のCRSが停止している場合はCRSを起動します。
【prsdb01、prsdb02 / rootユーザで実行】
-----------------------------------------------------------------------------
# CRS起動(prsdb01→prsdb02の順に1台ずつCRSを起動)
/opt/app/21.0.0/grid/bin/crsctl start crs -wait
DBサーバ#1からDBインスタンス、PDB、online_srvサービスの起動状況を確認し、停止している場合は起動します。
【prsdb01で実行】
-----------------------------------------------------------------------------
# oracleユーザにスイッチ
su - oracle
# DBの起動状況を確認
srvctl status database -db prdb
# DBが停止している場合は起動
srvctl start database -db prdb
# PDBの起動状況を確認
srvctl status pdb -db prdb -pdb prpdb
# PDBが停止している場合は起動
srvctl start pdb -db prdb -pdb prpdb
# online_srvサービスの起動状況を確認
srvctl status service -db prdb -service online_srv
# online_srvサービスが停止している場合は起動
srvctl start service -db prdb -service online_srv
アプリケーション用のオブジェクトを格納するための表領域とWebLogicからDBへの接続に使用するOracleユーザを作成します。このユーザはDB接続、オブジェクト作成、管理ビューへのアクセスを行うので必要な権限も付与しておきます。
【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# DBに接続
sqlplus / as sysdba
# コンテナをPDBに移動
alter session set container = prpdb;
# ユーザ・テーブル用表領域、ユーザ・インデックス用表領域を作成
create tablespace USERTBL01 datafile '+DG21/PRDB/prpdb/usertbl01.dbf' size 10G autoextend on next 16M;
create tablespace USERIDX01 datafile '+DG21/PRDB/prpdb/useridx01.dbf' size 5G autoextend on next 16M;
# ユーザ作成
create user PDBUSER identified by pdbuser
default tablespace USERTBL01 temporary tablespace TEMP
quota unlimited on USERTBL01
quota unlimited on USERIDX01;
# 権限付与
grant CREATE SESSION, RESOURCE, SELECT_CATALOG_ROLE to PDBUSER;
WebLogic起動
APサーバのAdmin Serverが停止している場合はAdmin Serverを起動します。
【prsap01、prsap02 / oracleユーザで実行】
-----------------------------------------------------------------------------
/opt/app/oracle/bin/startWebLogic_prs.sh
Managed Serverが起動している場合はManaged Serverを停止します。
【prsap01、prsap02 / oracleユーザで実行】
-----------------------------------------------------------------------------
/opt/app/oracle/bin/stopManagedWebLogic_prs.sh
マルチ・データ・ソース作成(APサーバ#1)
汎用データソースを2本作成し、これを束ねてマルチ・データ・ソースを構成します。汎用データ・ソース①は接続先DBインスタンスがprdb1、汎用データ・ソース②は接続先DBインスタンスがprdb2、負荷分散はマルチ・データ・ソース側に設定します。設定可能な振り分け方式はラウンドロビン一択です。
【マルチ・データ・ソース構成】
設定項目 | 設定値 |
マルチデータ・ソース名 | DS_PDBUSER_10 |
汎用データ・ソース | GDS_PDBUSER_11 GDS_PDBUSER_12 |
負荷分散方式 | ラウンドロビンによる各汎用データ・ソースへの静的ロードバランシング |
【汎用データソース】
設定項目 | 汎用データ・ソース① | 汎用データ・ソース② |
データソース名 | GDS_PDBUSER_11 | GDS_PDBUSER_12 |
DB接続ユーザ | PDBUSER | PDBUSER |
接続ホスト | prsdb01-con | prsdb02-con |
接続サービス名 | online_srv | online_srv |
ロードバランス | OFF | OFF |
初期要領 / 最大容量 / 最小要領 | 100 / 100 / 100 | 100 / 100 / 100 |
汎用データソース作成
WebLogic Remote Consoleを起動してAPサーバ#1に接続、ツリーの編集画面で「サービス」を展開、「データ・ソース」-「新規」をクリックします。

以下の設定で汎用データ・ソース①と汎用データ・ソース②を作成します。
【データ・ソース作成画面】
設定項目 | 汎用データ・ソース① | 汎用データ・ソース② |
名前 | GDS_PDBUSER_11 | GDS_PDBUSER_12 |
JNDI名 | GDS_PDBUSER_11 | GDS_PDBUSER_12 |
ターゲット | prs_ap01(チェックして「>」クリック) | prs_ap01(チェックして「>」クリック) |
データ・ソース・タイプ | 汎用データソース | 汎用データソース |
データベース・タイプ | Oracle | Oracle |
データベース・ドライバ | *Oracle’s Driver (Thin) for RAC Service-Instance connections; Versions:Any | *Oracle’s Driver (Thin) for RAC Service-Instance connections; Versions:Any |
グローバル・トランザクション・プロトコル | OnePhaseCommit | OnePhaseCommit |
データベース名 | prdb1 | prdb2 |
ホスト名 | prdb01-con | prdb02-con |
サービス名 | online_srv | online_srv |
ポート | 1521 | 1521 |
データベース・ユーザー名 | PDBUSER | PDBUSER |
パスワード | <DBUSERパスワード> | <DBUSERパスワード> |
プロトコル | TCP | TCP |
すべての項目の設定が完了したら画面上部の「作成」をクリックします。

汎用データ・ソースの作成に成功すると編集画面に遷移します。まず「構成のテスト」をクリックしてDBに接続できていることを確認します。


汎用データ・ソースの設定を行います。「接続プール」タブの「一般」タブと「拡張」タブをクリックして以下の通り編集します。なお、設定は各タブごとに保存します。

【接続プール – 一般タブ設定内容】
設定項目 | GDS_PDBUSER_11 | GDS_PDBUSER_12 |
URL | jjdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=prsdb01-con.exsample.lan)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=online_srv))) | jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=prsdb02-con)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=online_srv))) |
初期要領 | 100 | 100 |
最大容量 | 100 | 100 |
最小要領 | 100 | 100 |
※2025/7/6 /etc/hostsのドメイン名記載誤り修正(prsite.local → exsample.lan)。URLは修正後のホスト名を指定
【接続プール – 拡張タブ設定内容】
設定項目 | GDS_PDBUSER_11 / GDS_PDBUSER_12 |
予約時に接続をテスト | オン |
テスト頻度 | 60 |
テスト対象の表名 | SQL select 1 from dual |
縮小頻度 | 0 |
接続作成の再試行間隔 | 2 |
一通り設定が終わったら「一般」タブ(上段のタブ) -「構成のテスト」をクリックして構成に問題がないことを確認します。
マルチ・データ・ソース作成
WebLogic Remote Console画面左ツリーの「データ・ソース」をクリックしてデータソースの管理画面を表示、画面上部の「新規」をクリックします。

以下の設定でマルチ・データ・ソースを作成します。
【データ・ソース作成画面】
マルチ・データ・ソースの作成が完了すると管理画面に遷移します。「一般」タブの「テスト頻度」を60に設定して保存をクリック、画面上部「ショッピング・カート」-「変更のコミット」をクリックして変更を確定させます。

DBサーバ#1でPRDBに接続して現在のDBセッションを確認します。Managed Serverが起動していないので下記のSELECT文を実行すると「レコードが選択されませんでした。」と返されるはずです。
【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
# PRDBに接続
sqlplus / as sysdba
-- コンテナをPDBに移動
alter session set container = PRPDB;
-- 現在のDBセッションを確認
set pages 999 lines 100
col USERNAME format a8
col MACHINE format a8 trunc
col PROGRAM format a10 trunc
select INST_ID, MACHINE, USERNAME, PROGRAM, count(*) SESS_CNT
from GV$SESSION
where USERNAME is not NULL
and USERNAME != 'SYS'
group by INST_ID, MACHINE, USERNAME, PROGRAM
order by 1,2,3,4;
→ 。Managed Serverが起動していないので「レコードが選択されませんでした。」と返される
APサーバ#1のManaged Serverを起動します。Managed Serverを起動後、DBサーバ#1で同じSQLを再度実行してAPサーバ#1からDBサーバ#1、DBサーバ#2に各100本の接続が行われていることを確認します。
【prsap01 / oracleユーザで実行】
-----------------------------------------------------------------------------
/opt/app/oracle/bin/startManagedWebLogic_prs.sh
【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
-- SQL再実行
r
-----------------------------------------------------------------------------
【SQL実行結果】
-----------------------------------------------------------------------------
SQL> r
1 select INST_ID, MACHINE, USERNAME, PROGRAM, count(*) SESS_CNT,to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') TMSTMP
2 from GV$SESSION
3 where USERNAME is not NULL
4 and USERNAME != 'SYS'
5 group by INST_ID, MACHINE, USERNAME, PROGRAM
6* order by 1,2,3,4
INST_ID MACHINE USERNAME PROGRAM SESS_CNT TMSTMP
---------- -------- -------- ---------- ---------- -------------------
1 prsap01. PDBUSER Server 100 2025/07/09 15:18:13
2 prsap01. PDBUSER Server 100 2025/07/09 15:18:13
SQL>
Active GlidLink作成(APサーバ#2)
WebLogic Remote ConsoleでAPサーバ#2に接続して「ツリーの編集」画面から「サービス」-「データ・ソース」-「新規」をクリックします。

データ・ソースの作成画面が表示されるので以下のように設定して「作成」をクリックします。
【データ・ソース作成・設定内容】
設定項目 | 設定値 |
名前 | DS_PDBUSER_10 |
JNDI名 | DS_PDBUSER_10 |
ターゲット | prs_ap02(チェックして「>」クリック) |
データ・ソース・タイプ | GridLinkデータ・ソース |
データベース・ドライバ | *Oracle’s Driver (Thin) for GridLink Connections; Versions:Any |
グローバル・トランザクション・プロトコル | OnePhaseCommit |
リスナー | prsdb01-con.exsample.lan:1521 prsdb02-con.exsample.lan:1521 |
サービス名 | online_srv |
データベース・ユーザー名 | PDBUSER |
パスワード | <PDBUSERパスワード> |
プロトコル | TCP |
FANの有効化 | オン |
ONSノード | prsdb01.exsample.lan:6200,prsdb02.exsample.lan:6200 |
Active GlidLinkの作成に成功すると管理画面に遷移するので「構成のテスト」をクリックして構成に問題がないことを確認します。

「接続プール」タブをクリックして「一般」、「拡張」を以下の通り設定します。

【接続プール設定内容】
タブ | 設定項目 | 設定値 |
一般 | 初期容量 | 200 |
一般 | 最大容量 | 200 |
一般 | 最小容量 | 200 |
拡張 | 予約時に接続をテスト | オン |
拡張 | テスト頻度 | 60 |
拡張 | 縮小頻度 | 0 |
拡張 | 接続作成の再試行間隔 | 2 |
接続プールの設定及び保存が終了したら画面上部「ショッピング・カート」-「変更をコミット」をクリックして変更を確定させます。
Active GlidLinkの作成が完了したらDBサーバ#1でDB接続状況の確認用SQLを再実行して現在のDB接続状況を確認します。
【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
-- SQL再実行
r
-----------------------------------------------------------------------------
【SQL実行結果】
-----------------------------------------------------------------------------
SQL> r
1 select INST_ID, MACHINE, USERNAME, PROGRAM, count(*) SESS_CNT,to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') TMSTMP
2 from GV$SESSION
3 where USERNAME is not NULL
4 and USERNAME != 'SYS'
5 group by INST_ID, MACHINE, USERNAME, PROGRAM
6* order by 1,2,3,4
INST_ID MACHINE USERNAME PROGRAM SESS_CNT TMSTMP
---------- -------- -------- ---------- ---------- -------------------
1 prsap01. PDBUSER Server 100 2025/07/09 15:18:13
2 prsap01. PDBUSER Server 100 2025/07/09 15:18:13
SQL>
-- 現時点ではAPサーバ#1からDBサーバへの接続のみ存在
APサーバ#2でManaged Serverを起動します。
【prsap02 / oracleユーザで実行】
-----------------------------------------------------------------------------
/opt/app/oracle/bin/startManagedWebLogic_prs.sh
DBサーバ#1でDB接続状況の確認用SQLを再実行してAPサーバ#2からDBサーバ#1、DBサーバ#2のそれぞれ約100本の接続が行われていることを確認します。
【prsdb01 / oracleユーザで実行】
-----------------------------------------------------------------------------
-- SQL再実行
r
-----------------------------------------------------------------------------
【SQL実行結果】
-----------------------------------------------------------------------------
SQL> r
1 select INST_ID, MACHINE, USERNAME, PROGRAM, count(*) SESS_CNT,to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') TMSTMP
2 from GV$SESSION
3 where USERNAME is not NULL
4 and USERNAME != 'SYS'
5 group by INST_ID, MACHINE, USERNAME, PROGRAM
6* order by 1,2,3,4
INST_ID MACHINE USERNAME PROGRAM SESS_CNT TMSTMP
---------- -------- -------- ---------- ---------- -------------------
1 prsap01. PDBUSER Server 100 2025/07/09 16:08:33
1 prsap02. PDBUSER Server 100 2025/07/09 16:08:33
2 prsap01. PDBUSER Server 100 2025/07/09 16:08:33
2 prsap02. PDBUSER Server 100 2025/07/09 16:08:33
SQL>
-- 今回はたまたまAPサーバ#2からDBサーバ#1、DBサーバ#2に各100本の接続を生成。タイミングによっては少しバラけます
これでデータ・ソースの作成は一旦終了です。続けて細かい挙動をいろいろテストしてみたいところですが、実際にアプリからDBに接続してみないとロードバランシングの挙動だの通常のフェイルオーバーとFCFの比較だのといった確認ができません。ということで次は接続確認用のWebアプリケーションを作成します。
コメント