コネクションプーリングについて考える
0.改訂履歴
- 2002.08.04 新規作成
1.はじめに
このドキュメントでは,データベース接続に関するパフォーマンスアップの手法?である,コネクションプーリングの有効性について考えてみる.
なお,対象としているRDBMSは,なんでもよい.
2.データベース接続について考えてみる
- データベースとクライアントアプリケーションを,次のような関係にあるとする.
- この時,Clientがデータベースに接続すると,次の図のようになる.
- Clientの接続分だけ,DB Server上に,セッションを処理するプロセスやスレッドが起動する.
- 具体的に言うと,Oracleではプロセス(専用サーバ時)が起動し,Sybaseではスレッドが起動する.
- Clientからの接続が切れると,DB Server上にあるプロセス(スレッド)が終了する.
- この「DBサーバ側でプロセス(スレッド)が起動する動作」というのが,DBサーバからすると結構なストレスになる.
- 「セッションを確立する」という処理を大まかに考えると,次のような事を行っている.(順不同)
- ネットワーク上の専用の空き番号を取得する.
- プロセス(スレッド)等が起動するためのメモリを確保する.
- プロセスを立ち上げるためのプログラムをロードする.
- このように,メモリ,ネットワーク,I/Oに負担をかけてしまう事が分かる.
- よって,この頻繁なプロセス(スレッド)の起動・終了を減らす事が出来れば,データベースサーバ上の動作オーバヘッドによるパフォーマンス改善が可能となる.
3.コネクションプーリングの原理
- コネクションプーリングでは,接続時にコネクションを振り分けするアプリケーション層が存在する事になる.
- これを図解すると,次のようなイメージとなる.
- 実際にどのように稼働するかを示すと次の図のようになる.
- このアプリケーション層(Application Server)が事前にコネクションを確保しておく.
- よって,初期起動時にはDB Serverには負担がかかる.
- Clientが接続してきた場合,このアプリケーション層で,空いているセッションに対して振り分けを行う.
- よって,コネクションプーリングを使わない場合に比べ,接続の都度,DBサーバに負荷がかからなくなる.
- この図で分かるとおり,動作の負荷がアプリケーション層に移っており,そこに負荷が集中化されるが,アプリケーション層は複数搭載する事が可能な層なので,システム全体として負荷分散を実現する事が出来る.
4.コネクションプーリングの実装について
- コネクションプーリングは,特別な機能ではない.
- 各自でアプリケーションサーバを開発する際には,たとえばOracle Objects for OLE 2.3以降やJDBC 2.0を用いればよい.
- また,メジャーなアプリケーションサーバ,BEA WebLogicやWebSphererおよびODBC Administraotr等の管理画面を参照すると,プーリングに関する設定項目を確認する事が出来る.