<Insert Picture Here>
基礎から学ぶWebLogic (データベース接続編)
日本オラクル株式会社 Fusion Middleware事業統括本部 野邊哲男WebLogic Server勉強会@大阪
第71回 夜な夜な! なにわオラクル塾
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。
また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むことは
できません。以下の事項は、マテリアルやコード、機能を提供することをコミットメン
ト(確約)するものではないため、購買決定を行う際の判断材料になさらないで下さ
い。オラクル製品に関して記載されている機能の開発、リリースおよび時期につい
ては、弊社の裁量により決定されます。
Oracleは、米国オラクル・コーポレーション及びその子会社、関連会社の 米国及びその他の国における登録商標 または商標です。そ の他の名称はそれぞれの会社の商標の可能性があります。Agenda
•
Javaからのデータベース・アクセス基礎
•
Java Web アプリケーションからのデータベース・アクセス基礎
•
WebLogic11gのデータソース
•
WebLogic11gのデータソースの監視
•
WebLogic11gのデータソースにおける推奨/注意事項
<Insert Picture Here>
•
クライアント・サーバのシステムでも、Webシステムでも、アプリケーションで使
用する「データ」は、Oracleのようなリレーショナル・データベースに格納され
ることが一般的です。
•
アプリケーションからリレーショナル・データベースにアクセスするためには、
データベース提供元等から提供されるAPI群(ライブラリ)を使用する必要が
あります。
•
アプリケーションからOracleデータベースにアクセスするには?
•
C言語であれば、Oracle Call Interface (OCI)が利用できます。
•
.NETであれば、Oracle Data Provider .NETが利用できます。
•
Javaでは、JDBCドライバを利用します。
Javaからのデータベースアクセス
RDBMS
(Oracle Database)
アプリケーション
DBアクセス用 ライブラリJavaクラス,
Servlet, JSP など
JDBCとは
•
JDBCはJava Database Connectivityの略称です。
•
JDBCは、JavaからRDBMSに接続するための標準インタフェースです。
• そのため、接続先のDBの種類にかかわらず、共通のAPIを用いてデータ
ベースを操作するアプリケーションを開発できます。
•
JDBCのAPIパッケージはjava.sqlおよびjavax.sqlパッケージに含まれて
います。
•
JDBCのAPIを使用するためには接続先のDBをサポートしているJDBC
Driverが必要です。これは実際にデータベース接続を行うために必要なラ
イブラリ群です。
RDBMS
JDBC
JDBC API JDBC Driver java.sql.DriverManagerク ラスを使用し、Javaコード の中で接続先のDB情報,[参考] JDBCドライバの提供元
•
データベースベンダーが提供するケース
•
オラクル
•
Oracle Databaseに接続するための Oracle JDBC Driver
•
開発ツールOracle JDeveloperにはOracle JDBC Driverがバンドル
•
その他、TimesTen のJDBC Driverも
•
IBM
•
UDB DB2用のJDBC Driverを提供
•
アプリケーションサーバベンダーが提供するケース
•
オラクル
•
OracleAS10gにはOracle JDBC Driverがバンドル
•
Oracle WebLogic Serverには各種JDBC Driverがバンドル
•
その他ベンダーから提供されるもの
[参考] JDBCドライバのタイプ
•
Oracle JDBC Driverでは、Type2、Type4を提供しています。
TYPE 1
ODBC
ドライバ
JDBC-ODBC ブリッジドライバ DBアクセス用 ネィティブ ライブラリ JDBC ネイティブ ドライバ DBアクセス用 ネィティブ ライブラリ JDBCネット ドライバ JDBC Thin ドライバTYPE 2
TYPE 3
TYPE 4
Java アプリケーション ODBC API Native API 専用プロトコル 中継サーバ
Native Access Native Access
Java アプリケーション Java アプリケーション Java アプリケーション JDBC API (共通インターフェース)
JDBCの利用準備
•
JDBCを使用してDBアクセスを行うアプリケーションを作成する場合は、コ
ンパイル環境、実行環境のCLASSPATHに、JDBCドライバーのライブラ
リを追加しておく必要があります。
•
Oracleデータベースの場合、オラクルからOracle JDBC Driverが提供さ
れており、その実体であるojdbc6.jarというファイルをCLASSPATHに指
定します。(古いバージョンではojdbc14.jarなども存在します。)
•
CLASSPATHへのJDBC Driverの設定方法や必要性は、開発ツールや
実行環境により異なります。
•
例えば、Oracle JDeveloperであればOracle JDBC Driverは最初から組み込
まれており、 GUI操作で「ライブラリ」として設定するだけで使用できます。
•
また、OracleAS10gやWebLogicではあらかじめOracle JDBC Driverが組み
込まれており、データソース(後述)で指定するだけで使用できます。
JDBCを使用したSELECT文の実行
Connectionオブジェクトを取得します。(DriverManagerを使用) 接続先のデータベースに対応したJDBC Driverを用意します。 Statementオブジェクトを作成します。(Connectionオブジェクトを使用) 問い合わせのためにexecuteQuery()メソッドを実行します。(Statementオ ブジェクトを使用) 問合せを実行してResultSetオブジェクトを取得する場合、ResultSetを繰り 返し処理して、各行のデータを処理します。 終了後、ResultSet、StatementおよびConnectionオブジェクトをクローズし ます。 1. JDBC Driverの登録 2.コネクション作成 3. Statementオブジェクトの作成 4. SQL文(SELECT文)の実行 5. 問合せ結果の処理 6. 接続のクローズ 0. JDBC Driverの準備 JDBC Driverの使用登録を行います。DB接続・検索実行のロジック(例)
import java.sql.*;
...
String sql = “select empno, ename from emp” //実行するSQL文 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); String url = “jdbc:oracle:thin:host1:1521:SID”;
Connection conn =DriverManager.getConnection(url,”SCOTT” “TIGER”); //コネクション取得 Statement stmt = conn.createStatement(); //Statementの作成
ResultSet rset = stmt.executeQuery(sql); //結果セットの取得 while (rset.next( ) ) { System.out.println( “従業員番号” + rset.getString(“empno” ) ); System.out.println( “従業員名” + rset.getString(2 ) ); } rset.close(); //結果セットクローズ処理 stmt.close(); //Statementクローズ処理 conn.close(); //コネクションクローズ処理 データソースを使用したDBアクセスに必 要なパッケージ 1. JDBC Driverの登録 4. SQL文(SELECT文)の実行 6. 接続のクローズ 5. 問合せ結果の処理 3. Statementオブジェクトの作成 2.コネクション作成 ※JDBCの使用中にエラーが発生した場合、データベースにアクセスするすべてのメソッドはSQLExceptionをスローし ます。この例外は、JDBCコードで常に処理する必要があります。 JDBC URL 接続先データベースの指定
DB接続・更新のロジック(例)
import java.sql.*;
...
String sql = “update emp set sal = 100 where empno = 7499”; //実行するSQL文 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String url = “jdbc:oracle:thin:host1:1521:SID”;
Connection conn =DriverManager.getConnection(url,”SCOTT” ,“TIGER”); //コネクション取得 Statement stmt = conn.createStatement(); //Statementの作成
stmt.executeUpdate(sql); //更新の実行 ... stmt.close(); //Statementクローズ処理 conn.close(); //コネクションクローズ処理 データソースを使用したDBアクセスに必 要なパッケージ 1. JDBC Driverの登録 4. SQL文(UPDATE文)の実行 5. 接続のクローズ 3. Statementオブジェクトの作成 2.コネクション作成 ※JDBCの使用中にエラーが発生した場合、データベースにアクセスするすべてのメソッドはSQLExceptionをスローし ます。この例外は、JDBCコードで常に処理する必要があります。 JDBC URL 接続先データベースの指定
[参考] JDBCによるストアド・プログラムの実行
• JDBCでストアド・プロシージャやストアド・ファンクションを実行する場合は、
CallableStatementを利用します。
• ここでは、ストアド・プロシージャを実行する例を紹介します。
PROCEDURE "GETENAME" (p_empno in number, r_ename out varchar2) AS
cursor c1 is select ename from emp where empno = p_empno; BEGIN
for rec in c1 loop
r_ename := rec.ename; end loop;
exception
when others then
r_ename := SQLERRM; END;
CallableStatement cstmt = conn.prepareCall("{call getename(?,?)}"); cstmt.setInt(1,7499); cstmt.registerOutParameter(2, Types.VARCHAR); cstmt.executeQuery(); System.out.println(cstmt.getString(2)); cstmt.close(); conn.close(); ストアド・プロシージャ GETENAME CallableStatement を使用して GETENAMEを実行
[参考] 同じSQLを繰返し実行する場合
• Where句の条件値のみ変化する同じSQLを繰り返し実行する場合は、
PreparedStatementの使用を検討してください。
• PreparedStatement使用時はDB側の解析処理数が減るため、繰り返し
実行する場合はStatement使用時より性能向上が期待できます。
Statement stmt = conn.createStatement(); for ( int id = 0 ; id < 10000 ; id++ ) {String sql = "SELECT ENAME FROM EMP WHERE EMPNO = " + id; ResultSet rs = stmt.executeQuery(sql);
while ( rs.next() ) { // 表示などの処理 }
}
String sql = "SELECT ENAME FROM EMP WHERE EMPNO = ?"; PreparedStatement ps = conn.prepareStatement(sql);
for ( int id = 0 ; id < 10000 ; id++ ) { ps.setInt(1,id); ResultSet rs = ps.executeQuery(); while ( rs.next() ) { // 表示などの処理 }
Statement
使用時
PreparedStatement
使用時
<Insert Picture Here>
Java Webアプリケーションのデータベース接続
•
JavaのWebアプリケーション、つまりJavaEEアプリケーションからデータベー
ス接続を行うには、下記2つの方法があります。
1.DriverManagerによる接続
アプリケーションで使用するJDBC Driverを指定し、接続先DBを指定して接
続を行う方法
•
これは、前述スライドで説明した方法です。
2.データソースによる接続
アプリケーション・サーバ側で、使用するJDBC Driver、接続先DBを指定し、
設定名をつけておく。アプリケーションからは、その設定名だけを指定して接
続を行う
•
この方法の場合、アプリケーション開発者は、物理的なデータベース接続設定を
行う必要がなく、設定名だけを意識すればいいため、移植性が高く、接続先DBの
変更時などに柔軟に対応できます。また、通常、APサーバではデータソース利用
時は接続プール機能を利用でき、DB接続時の性能を向上させます。
データソースのイメージ
•
Java APサーバでは、一般的にデータソースの機能を提供しています。
•
Java Webアプリケーションは、データソースを用いて接続を行うことがほとんどです。
Javaアプリケーション DB接続に必要な情報 ドライバ名、サーバ名、SID DBユーザ名、パスワードなど JDBC Driver Javaアプリケーション DB接続に必要な情報 ドライバ名、サーバ名、SID DBユーザ名、パスワードなど 名前:DS-A 名前:DS-A Javaアプリケーション 名前:DS-A Java APサーバが提供する データソース・サービス JDBC Driverデータソースによる接続
Driver Managerによる接続
接続プールについて
• JDBCのAPIでは、Connectionというオブジェクトを生成してデータベース接続を確立します。 • データベースとの接続を終了する時も、Connectionオブジェクトを使用します。 • しかし、アプリケーションが都度、Connectionを生成したり、接続終了をしていると性能面で大きなオー バーヘッドが発生します。 • 一般的なJava APサーバでは、「接続プール」により、事前に生成し、プールに蓄積した複数の Connectionオブジェクトをアプリケーションで使いまわすことで性能劣化を防ぐ機能を提供しています。 • 接続プール中に生成されたConnectionをオブジェクトとDB間の接続を「物理接続」といいます。 • アプリケーションが接続プール中のConnectionオブジェクトを取得することを「論理接続」といいます。Javaアプリ
データ ソース 接続プール ①必要なとき、 プールから借りる ②使い終わったら、 プールに返す ….Connection オブジェクト DB 物理接続 論理接続データソースと接続プールのアーキテクチャ
•
一般的なJava APサーバでは接続プールはデータソースの機能の一部または関連付け
を行って利用するため、アプリケーションはデータソースの名前だけを指定すれば接続
プールを利用できます。
•
データソースの名前は、Java APサーバのJNDIサービスにより管理されます。アプリ
ケーションは、JNDIサービスにデータソース名前を提示して、目的のデータソースをオブ
ジェクトとして取得し、さらにConnectionオブジェクトを取得します。
データソース・サービス 接続プール データソース dsA データベース JNDIネーミング・サービス アプリケーション ルックアップ jdbc/dsA JNDI名 jdbc/dsA Java APサーバ 利用するJDBCドライバ やDB接続情報データソースを使用したSELECT文の実行
Connectionオブジェクトを取得します。(javax.sql.DataSourceを使用) DB接続情報, JDBCドライバ名などを記述したデータソースを設定します。 Statementオブジェクトを作成します。(Connectionオブジェクトを使用) 問い合わせのためにexecuteQuery()メソッドを実行します。(Statementオ ブジェクトを使用) 問合せを実行してResultSetオブジェクトを取得する場合、ResultSetを繰り 返し処理して、各行のデータを処理します。 終了後、ResultSet、StatementおよびConnectionオブジェクトをクローズし ます。 1. データソースオブジェクト取得 2.コネクション作成 3. Statementオブジェクトの作成 4. SQL文(SELECT文)の実行 5. 問合せ結果の処理 6. 接続のクローズ 0. データソース設定 JNDIルックアップを行い、使用するデータソースオブジェクトを取得しま す。(javax.namingパッケージを使用)DB接続のロジック(例)
import javax.naming.*; import javax.sql.*; import java.sql.*; import oracle.jdbc.*; ...String sql = “select * from emp” //実行するSQL文
Context ic = new InitialContext(); //JNDIルックアップのための初期コンテキスト取得
DataSource ds = (DataSource)ic.lookup(“jdbc/OracleDS”); //データソースオブジェクト取得 Connection conn = ds.getConnection(); //コネクション取得
Statement stmt = conn.createStatement(); //Statementの作成 ResultSet rset = stmt.executeQuery(sql); //結果セットの取得 ... rset.close(); //結果セットクローズ処理 stmt.close(); //Statementクローズ処理 conn.close(); //コネクションクローズ処理 データソースを使用したDBアクセスに必 要なパッケージ 1. データソース オブジェクト取得 4. SQL文(SELECT文)の実行 6. 接続のクローズ 5. 問合せ結果の処理 3. Statementオブジェクトの作成 2.コネクション作成 ※JDBCの使用中にエラーが発生した場合、データベースにアクセスするすべてのメソッドはSQLExceptionをスローし ます。この例外は、JDBCコードで常に処理する必要があります。 JNDI論理名: この文字列でデータソースをルックアップ
<Insert Picture Here>
WebLogic 11gに含まれるJDBCドライバ
• WebLogic11gからデータベース接続を行う場合、基本的にそのデータベースに接続できるJDBCド ライバをCLASSPATHに付加すればデータソースを構成でき、接続可能になります。 • WebLogic11gが標準でバンドルしているJDBCドライバは下表です。 • ドライバの実体は、WL_HOME/server/libに格納されています。 ドライバ 対象データベース ファイル名 備考Oracle Thin Driver 11g Oracle Database ojdbc6.jar TYPE4 MySQL5.0 JDBCドライバ MySQL
mysql-connector-java-commercial-5.0.x-bin.jar Non-XA WebLogic Type4 JDBCドライバ DB2 MS SQL Server Informix, Sysbase 共通: wl_base.jar , wl_util.jar DB2用:wldb2.jar MS SQL Server用:wlsqlserver.jar Informix用:wlinformix.jar Sybase用:wlsybase.jar DataDirectの OEM供給 WebLogicインストール時にサンプル導入を指定した場合、Derby DBMSもインストールされます。 これはWebLogicのサンプルを動作させる目的のみで利用できます。
WebLogic 11gのデータソースの種類
• WebLogic 11gでは、3種類のデータソース機能を提供しています。 • 単体のDB接続には、「汎用データソース」を、Oracle RACには「マルチデータソース」か「GridLink データソース」を利用します。 種類 用途 概要 汎用データソース (または単に、 「データソース」ともいう) DB単体用 単体のDBインスタンスに特定のDBユーザで接 続する。 マルチデータソース (当資料では詳細説明は割 愛しています。) 複数のDBイン スタンス用 (主にOracle RACで利用) 複数のデータソースをまとめて1つのデータソー スとして利用することで接続分散と可用性向上を 可能に。 Grid Link データソース (当資料では詳細説明は割 愛しています。)Oracle RAC用 Oracle RAC側から死活情報、負荷情報を取得し、 アプリからの論理接続時に、それらの情報を考 慮した上で最適なConnectionを利用させる。
[参考]データソースとマルチデータソース
• データソースは単体のDBインスタンスに特定ユーザで接続 • マルチデータソースは複数データソースをまとめて1つのデータソースとする。 • これにより、アプリからの接続要求を分散したり、1つのデータソースの接続先DBインスタンスに障 害が発生した場合に、そのデータソースをアプリに利用させないように自動制御が可能。 • つまり、Oracle RACのようなDBクラスタ環境での適用を前提としている。 データソース1 データソース2 データソース3 WebLogic アプリケーション マルチデータソース データソース WebLogic アプリケーション Oracle RACWebLogic 11gのデータソースのスコープ
• WebLogic11gのデータソースには、2種類のスコープ(利用可能範囲)が存在します。 • スコープは、構成方法によってその範囲が決定します。 スコープの種類 概要 サーバスコープ AdminコンソールやWLSTで構成する。 指定したWebLogicサーバ上のアプリ全体で利用可能。 アプリケーションスコープ アプリケーションにデータソース定義XMLファイルを含ませて 構成する。そのアプリケーションだけで利用可能。 アプリケーション アプリケーション アプリケーション データソースB データソースA WebLogic[参考] WebLogic11gのサーバースコープのデータソース
• サーバースコープのデータソースは、WebLogicドメインに対して構成し、その中で利用するサーバを対 象として指定します。 • DOMAIN/config/jdbc配下にデータソース毎の定義ファイル(データソース名-id-jdbc.xml)が生成されま す。 • JDBCデータソースの対象サーバの情報はドメイン構成ファイル(config.xml)で保持されます。 • データソースを削除すると、上記XMLやconfig.xmlのエントリも削除されます。 データソース dsA データソース dsA データソース dsA 管理対象サーバA 管理対象サーバB WebLogicドメイン アプリ -W アプリ -X アプリ -Y アプリ -Z dsA-9999-jdbc.xml config.xml データソースの定義内容 ドメイン構成ファイル。 データソースと対象サーバの 関連の定義もここに含まれる。WebLogic11gのデータソースの構成や監視について
• WebLogicのデータソースは、主に管理コンソールやWLSTを用いて管理操作や監視を行います。 • 構成は、通常の管理ツール(AdminコンソールやWLST)を用いますが、データソース設定を記載し たXMLファイルを用意し、そのファイルをデプロイすることで構成することも可能です。 • 個々のデータソースや関連リソースに対応するConfiguration MBean(WebLogicが提供する構成 用Javaオブジェクト)により変更、監視が可能です。• また、WebLogicのデータソースはJSR-77(Java EE Management Model )をサポートしており、実 行時の情報をRuntime MBean(WebLogicが提供する監視用Javaオブジェクト)を用いて動作状況 や性能をモニタリングすることも可能です。 ツール 作成・削除 変更 監視 管理コンソール ○ ○ ○ WLST ○ ○ ○ JMX APIや任意のJMX MBeanツール ○ ○
データソース作成時に必要なパラメータ
• 下表パラメータは、データベース種類に限らずデータソース定義時の共通項目
• 接続プールは、コンソールではデータソース作成後に「接続プール」タブから設定します。
項目( *は必須項目) 概要 Oracle Databaseの場合の例
データソース名* WebLogicでの管理名 dsA
JNDI名* JNDIツリーへのバインド名 jdbc/dsA
データベース種類* OracleやDB2など ※1 Oracle
ドライバ種類* データベース種類に応じて指定 ※1 Oracle Thin Instance-Connection
トランザクション・オプション 非XAドライバの場合に指定 1phase commit
データベース名* データベースのID ORCL ホスト名* データベースのホスト名 localhost ポート* データベースへの接続ポート 1521 データベース・ユーザ名 データベースユーザ名 SCOTT パスワード データベースユーザのパスワード TIGER ドライバ・クラス名* JDBCドライバのクラス名※2 oracle.jdbc.OracleDriver
URL* JDBC URL※2 jdbc:oracle:thin:@localhost:1521:ORCL
JDBCドライバ・プロパティ JDBCドライバ
テスト対象の表名(or SQL) 接続テストに利用する表またはSQL SQL SELECT 1 FROM DUAL
接続プールの主要パラメータ
• パラメータの設定指針にについては、後の「WebLogic11gのデータソースにおける推奨/注意事項」 で説明します。 項目 概要 デフォルト値 初期容量 接続プール作成時に作成されるConnection数。 接続プールに維持される最小接続数でもある。 1 最大容量 接続プール中に作成可能な最大Connection数 15 増分容量 接続プール中に新たにConnectionを増加するときの量 1 予約時に接続をテスト アプリケーションが接続要求を行った際に、Connectionの有効性をテストする か否か。(テスト対象の表名の指定が必須) false テスト頻度(秒) 接続プール中の未使用Connectionに対する接続テストの実行間隔。テスト失 敗時はそのConnectionを無効化して再度Connectionを作成 (テスト対象の表名の指定が必須) 120 アイドルプール接続を信頼する秒数 ここで指定した時間内に正常と確認されたConnectionのテストはスキップする。 10 縮小頻度(秒) 接続プール内のConnection数を縮小させるまでの間隔 900 非アクティブ接続タイムアウト(秒) アプリケーションで使用中のConnectionが非アクティブの場合、ここで指定した 秒数が経過すると接続プールに自動復旧する 0(無効) 接続予約のタイムアウト(秒) アプリケーションがConnectionを要求して取得するまで待機できる秒数 10 接続作成の再試行間隔(秒) 接続プール中のConnection作成が失敗した場合に再作成を試行する間隔 0 文タイムアウト JDBCドライバに対して実行中のSQL文をタイムアウトする時間の指定. -1Oracle JDBC Driverによるデータソース作成
• WebLogic Serverに含まれるOracle のJDBCドライバを利用してデータソースを作成する場合、 ドライバのタイプと接続先指定方法により下表6パターンから1つを選択します。
• Instance Connection: オラクルのSIDを指定する方法 (例:jdbc:oracle:thin:@localhost:1521:XE)
• Service Connection: オラクルのservice_nameを指定する方法 (例:jdbc:oracle:thin:@localhost:1521/XE)
• RAC Service-Instance Connection:Oracle RACにマルチデータソースで接続する際に使用
ドライバ種類 ドライバ・クラス 接続先指定方法
XA Thin ドライバ
oracle.jdbc.xa.client.OracleXADataSource Instance Connection Service Connection RAC Service-Instance Connection
Thin ドライバ
oracle.jdbc.OracleDriver Instance Connection Service Connection RAC Service-Instance Connection
WebLogic11gデータソースの動作
(起動時)
• WebLogic起動時に、データソースが初期化され、接続プール中に「初期容量」で指定した数の Connectionオブジェクトが作成され(つまり、物理接続が行なわれ)、アプリケーションから利用可能 になります。接続プール
データソース dsA WebLogic Server 起動時に初期化 WebLogic管理対象サーバ 初期容量3の場合WebLogic11gデータソースの動作
(アプリケーション接続要求時) • アプリケーションがデータソースを利用して接続を要求した時、データソースの接続プールに未使用 のConnectionオブジェクトがあれば、それを「予約」してアプリケーションが利用します。 • アプリケーションは利用後coloseメソッドを実行すると、接続プールにConnectionオブジェクトが戻 されます。 • アプリケーションがリリースを行わないと、接続プールにConnectionオブジェクトが戻らず、他のア プリから使用できない状態になります。これをConnectionリークといい、接続プールにおいては発 生させてはならない事象の一つです。接続プール
データソース dsA WebLogic管理対象サーバアプリケーション
① getConnection() で予約 ② 使用 ③ Connectionの Close()でリリースWebLogic11gデータソースの動作
アプリケーション接続要求時に未使用接続が無い場合①
• 接続プール中のConnectionオブジェクト数が最大容量に達していない場合は、プール中に「増分容 量」で指定した分、新たなConnectionオブジェクトが生成され、アプリケーションはそれを予約、使用 することが可能です。接続プール
データソース dsA WebLogic管理対象サーバアプリケーション
アプリケーション
アプリケーション
アプリケーション
① getConnection() で予約 ②最大容量5で設定し、現在接続数3の場合、 まだプールにConnectionを追加することが可能。 増分容量1なので、接続を1つ追加作成する ③ アプリケーションで 利用可能WebLogic11gデータソースの動作
アプリケーション接続要求時に未使用接続が無い場合② • 接続プール中のConnectionオブジェクト数が最大容量に達している場合は、接続プールに Connectionオブジェクトが戻るまで「接続予約のタイムアウト」で指定した秒数分だけ待機します。 • 「接続予約のタイムアウト」で待機してもConnectionオブジェクトを得られなかった場合、下記例外 が発生します。 • weblogic.jdbc.extensions.PoolLimitSQLException: weblogic.common.resourcepool.ResourceLimitException:• No resources currently available in pool dsA to allocate to applications, please increase the size of the pool and retry..
接続プール
データソース dsA WebLogic管理対象サーバアプリケーション
アプリケーション
アプリケーション
① getConnection() で予約 ②最大容量5で設定し、現在使用数5の場合 アプリは「接続予約のタイムアウト」まで待機。 タイムアウトになると例外発生アプリケーション
アプリケーション
アプリケーション
<Insert Picture Here>
[参考] 実行時の統計情報の項目①
• Rutime Beanによる実行時の統計情報の主要な項目 管理コンソールの監視項目名 JDBCDataSourceRuntimeMBeanの属性名 説明 アクティブな接続の平均数 ActiveConnectionsAverageCount 使用中接続の平均数 現在アクティブな接続の数 ActiveConnectionsCurrentCount 現在使用中の接続数 アクティブな接続の最大数 ActiveConnectionsHighCount 同時に使用された接続の最大数 接続遅延時間(msec) ConnectionDelayTime 物理接続の作成に要した平均時間 接続の総数 ConnectionsTotalCount データ・ソースで作成されたデータ ベース接続の累計数 現在の容量 CurrCapacity 接続プール中の接続数 予約に失敗した要求の数 FailedReserveRequestCount アプリが接続予約に失敗した数 再接続の失敗数 FailuresToReconnectCount データソースが物理接続のリフレッ シュに失敗した回数 リークした接続数 LeakedConnectionCount アプリがcloseしなかった接続数 使用可能数 NumAvailable 接続プール中の使用可能な接続数 使用不可数 NumUnavailable 接続プール中の未使用の接続数 予約された要求の数 ReserveRequestCount 接続要求の現在の累積数。[参考] 実行時の統計情報の項目②
管理コンソールの監視項目名 JDBCDataSourceRuntimeMBeanの属性名 説明 プリペアド・ステートメント・ キャッシュのアクセス数 PrepStmtCacheAccessCount 文キャッシュにアクセスされた累計数 プリペアド・ステートメント・ キャッシュの追加数 PrepStmtCacheAddCount 文キャッシュに追加された文の現在の 累積数 プリペアド・ステートメント・ キャッシュの現在サイズ PrepStmtCacheCurrentSize 文キャッシュの現在の数 プリペアド・ステートメント ・キャッシュの削除数 PrepStmtCacheDeleteCount キャッシュから削除された文の数 プリペアド・ステートメント・ キャッシュのヒット数 PrepStmtCacheHitCount 文キャッシュが使用された数 プリペアド・ステートメント・ キャッシュの失敗数 PrepStmtCacheMissCount 文キャッシュが使用されなかった数 最大待機時間(秒) WaitSecondsHighCount 接続待機の最大時間 接続待機の現在数 WaitingForConnectionCurrentCount 接続待機している現在の要求数 接続待機の失敗総数 WaitingForConnectionFailureTotal 接続待機後、接続予約に失敗した総数 接続待機の最大数 WaitingForConnectionHighCount 接続待機した要求の最大数 接続待機の成功総数 WaitingForConnectionSuccessTotal 接続待機後、接続を予約できた総数管理コンソールによる監視例
• 接続プールの「最大容量」値が適切かどうかを監視する例 • 下記例では、「最大容量」を2、「接続予約のタイムアウト」を10秒に設定 「接続予約のタイム アウト」まで待機している リクエストがある。 予約失敗が 多数発生 待機の最大数が 18発生。 「最大容量」の 2まで達成する ことがある。 これらを総合すると最大容量が不足しており、最低でも20 (2 + 18)に する必要があると判断できる。監視ダッシュボードによる監視例
• 接続プールの状況を自動的にリフレッシュさせつつ、時系列に確認したい場合などは管理コンソールの 監視ダッシュボードが便利です。 • 監視ダッシュボードのURL: http://(host):(port)/console/dashboard 接続プール中 のConnection数 現在使用 されている Connection数WLSTのスクリプトによる監視例
• WLSTを活用し、データソースの接続プールの監視項目を定期的にチェックしてファイルに書き込んだ り標準出力に表示するような処理を行うスクリプトを作成できます。 この例では、5秒毎に 接続プールの状況を取得し 表示とファイル出力を同時に 行うWLSTのスクリプトを実行しています。 (このスクリプトは WebLogic11g独習キット vol.2に 含まれています。)<Insert Picture Here>
WebLogic11gデータソースにおける
1. 接続プールの容量について
• 接続プールの容量における推奨事項。 接続プールの「初期容量」や「最大容量」の値は同じにする。 • これは、下記理由によるもの。 • 接続プールの初期容量と最大容量が異なる場合、同時リクエスト数によっては接続プール内で新た にDBへの物理接続処理が発生し得る。また接続プールの縮小処理も発生し得る。このDBへの物 理接続や縮小時の切断処理は決して軽くない。 • そのため運用中に接続プール中の接続が増減しないように「初期容量」や「最大容量」の値は同じ にすることを推奨する。 初期容量5、最大容量5の場合、 WebLogic起動時に接続プールに 5つのConnectionオブジェクトが 作成され、その後増加も減少もしない。 つまり、その分、物理接続や切断の オーバーヘッドが無い 接続プール2. 接続プールの容量とスレッド数について
• 接続プールの容量における推奨事項。 WebLogicで同時実行される最大スレッド数 <= 接続プールの「最大容量」にする。 • これは、下記理由によるもの。 • WebLogic上のアプリケーションはスレッドにて処理されるが、同時実行スレッド数が多くなると、そ れに対応できる接続プール中の接続が無ければ接続予約時でスレッドの待機が発生してしまい、 性能に影響を与えてしまう。 • (ただしリクエストによりスレッドがDB接続を行わないこともあるという場合は、この限りではない) • WebLogicで同時実行される最大スレッド数はワークマネジャー機能でサーバまたはアプリケーショ ン別に指定できる。その際に、最大スレッド数=特定の接続プールの最大容量として指定すること も可能。 アプリ アプリ アプリ アプリ アプリ スレッド スレッド スレッド スレッド スレッド 接続プール3. 接続プールのテストについて
• 接続プールのテストにおける推奨事項 接続プールでテスト機能を設定するか否かは、データベース障害時の対応における要件と、デー タベース・サーバ側の負荷状況を鑑みて判断する。 • WebLogicのデータソースにはテスト機能が存在し、アプリケーションが予約時、または指定頻度で 指定したSQLを自動実行し、その結果でDBの死活状況をチェック可能。 • データベース・サーバ側の負荷(CPU使用率など)が非常に高い場合、接続プールのテスト機能は 極力使用しない方がよい。 • (シングル構成の)データベースが運用中に、障害等で再起動してしまった場合で、その際に WebLogicサーバまたはデータソースの再起動などの手動操作を行うことが許容されない場合は、 「接続予約時のテスト」をtrueにし、かつ「テスト頻度」も設定し、接続テストを実施させる。 接続プール ② SQL実行SELECT 1 from dual
アプリ
①予約
③SQL 結果OKなら 利用させる