Apache::DBIモジュール v.0.87(日本語チョー訳)

by Hippo2000(2000/6/2)

Apache::DBIモジュールなのです。

なおこのドキュメントはCPAN-Searchで出てきたドキュメント(PODを変換したもの)を日本語に訳そうとしたものです。わかりにくい部分は本物を見てください。(^^;;

原本の著作権はEdmund Mergl 氏がお持ちです。
Edmund Mergl さんにはメールで了解をいただきました。

なお内容等が間違っていたら修正します。ご連絡ください。


目次


名前

Apache::DBI - 永続データベース接続を開始する


概要

 # httpd.confまたはstartup.plでコンフィギュレーション
 PerlModule Apache::DBI  # これはDBIを使うほかのすべてのモジュールよりも先にくる。

 

スクリプトは何も変更しないように。このモジュールの仕様はまさにトランスペアレントなんですから!

 


説明

このモジュールは永続データベース接続を開始します。

データベースアクセスはPerlのDBIを利用します。サポートされているDBIドライバについては以下をご覧ください:

 http://www.symbolstone.org/technology/perl/DBI/

DBIモジュールをロードすると(Apache::DBIモジュールと混同しないで下さい)、環境変数 GATEWAY_INTERFACEが'CGI-Perl'で始まっているか、Apache::DBIが既にロードされているかを見ます。その場合、各接続要求はApache::DBIモジュールに転送されます。そして以前の接続要求によるデータベース・ハンドルが既に保存されているか、そしてそのハンドルがまだ有効であるかをpingメソッドを使って見ます。これら2つの条件を完全に満たしているならば、単にデータベース・ハンドルを返します。接続を定義するパラメータは接続属性も含めてまったく同じでなければなりません!有効なデータベース・ハンドルがない、あるいはpingメソッドが失敗すれば、新しい接続が確立され、後の再利用のために保存されます。あなたのプログラムからdisconnectステートメントを削除する必要はありません。Apache::DBIモジュールがdisconnectメソッドをオーバーロードしているので、それは何もしません。

Apache::DBI モジュールには、まだ制限があります: 各プロセス毎に接続の永続化を保持します。ユーザが何回もデータベースにアクセスすると、httpリクエストが別のサーバによるものとまるで同じように扱われることが問題になります。各サーバはそれぞれ独自に接続する必要があります。すべてのサーバがデータベース・ハンドルを共有できるのであれば、素晴らしいでしょう。現時点では各プロセスの名前空間の違いのために、これは不可能です。またhttpdの起動時にデータベース・ハンドルを生成し、このハンドルを後のサーバに継承するといったこともできません。そのハンドルが2つのプロセスによって同時に使われると、障害が発生するでしょう。

この制限を念頭におくと、Apache::DBIの価値を下げてしまうようなパターンがあります。各ユーザがユニークなユーザIDでデータベースに接続する高負荷なWebサイトについて考えてみてください。各サーバが新しいバックエンド・プロセスが生成されるたびにデータベース・ハンドルを生成し、その数が増えていきます。このため短時間のうちに、Webサーバは死んでしまうでしょう。

もう1つの問題はタイムアウトです:いくつかのデータベースは、活動していない時間が一定時間を過ぎるとクライアントを切断します。モジュールはDBIモジュールのpingメソッドを使ってデータベース・ハンドルが有効であるかを試します。このメソッドはデフォルトはtrueを返します。データベース・ハンドルが有効でなく、ドライバがpingメソッドを実装していなければデータベースにアクセスするとエラーになります。これを回避するために、なんらかのデータベース・コマンドによりpingメソッドを置き換えることができます。これはコストが少なく安全です。またpingメソッドの使用を止めることもできます。(下記のコンフィグレーションをご覧下さい)

以下に汎用化されたpingメソッドを示します。これはドライバ・モジュールに追加できます:

{ package DBD::xxx::db; # ====== DATABASE ====== use strict;

    sub ping {
        my($dbh) = @_;
        my $ret = 0;
        eval {
            local $SIG{__DIE__}  = sub { return (0); };
            local $SIG{__WARN__} = sub { return (0); };
            # データベースに合わせたSELECTステートメント:
            my $sth = $dbh->prepare("SELECT 1");
            $ret = $sth && ($sth->execute);
            $sth->finish;
        };
        return ($@) ? 0 : $ret;
    }
}

トランザクション:通常のDBIスクリプトはスクリプトが終了するときには、いつも自動的にロールバックします。永続化されたデータベース接続の場合は、データベース・ハンドルは破壊されません。そのために自動的なロールバックは発生しません。一見、複数のリクエストをまたがったトランザクションを扱うことが出来るかのようにも見えるます。しかしこれはやめなけばなりません、というのも異なるリクエストは異なるサーバによって扱われ、そのサーバは他のサーバによって開始された特定のトランザクションの状態を知らないからです.一般的に各スクリプトの最後で明示的にcommitまたはrollbackを実行するのはよいことです。データベース上の不整合を避けるため、AutoCommitがオフでスクリプトが明示的なrollbackなしに終了した場合には、Apache::DBIモジュールは、各リクエストの最後にPerlCleanupHandlerを使ってrollbackを発生させるます。最初にdata_sourceがAutoCommit=0に設定されている場合だけ、この後片付けハンドラ(CleanupHandler)が使われるということに注意してください。connectが行われた後、AutoCommitがオフにされた場合には使われません。

このモジュールはApache::Statusのためのメニュー・アイテムを組みこみます。メニューは現在のデータベース接続の一覧を表示します。これは上記で説明したような制限のために不完全であるかもしれません。特定のサーバのための現在のデータベース接続を示し、そのサーバは現在のリクエストに、たまたま対応しているサーバです。他のサーバは他のデータベース接続を持っていることでしょう。Apache::StatusモジュールはApache::DBIモジュールの前にロードされなければなりません!


コンフィグレーション

このモジュールはApacheデーモンが起動されるさいにロードされなければなりません。以下の行をhttpd.confまたはstartup.plに追加してください。:

 PerlModule Apache::DBI

DBIを使う他のモジュールの前に、このモジュールをロードするということは重要です!

startupファイルでPerlRequireディレクティブによって、このモジュールをロードするのが一般的な使い方です。例としてeg/startup.plをご覧ください。

サーバ毎に固有でサーバの起動時に可能な設定が2つあります。

 Apache::DBI->connect_on_init($data_source, $username, $auth, \%attr)

これはプロセス起動時にapacheサーバに接続を確立させる簡単な方法として使うことができます。

 Apache::DBI->setPingTimeOut($data_source, $timeout)

これは接続の適切であるかのpingメソッドの使用方法について設定します。タイムアウト(timeout)を0にするとpingメソッドを使って常にデータベース接続が有効か判断します(デフォルト)。タイムアウトを<0にするとデータベースハンドルの有効かのチェックを動かないようにします。これはpingメソッドを実装していないドライバに使うことが出来ます。タイムアウトを>0に設定すると、最後のアクセスからタイムアウト秒を超えている場合のみ、データベースにpingします。

メニュー・アイテム'DBI connections'のため、Apache::DBIの前にApache::Statusを呼び出す必要があります!コンフィギュレーションの順序の例については、startup.plをご覧ください。

デバッグを可能とするためには$Apache::AuthDBI::DEBUGを設定しなければなりません。これはstartup.plでもユーザのスクリプトでもどちらでも可能です。1に設定すると、単に新しい接続について報告されます。2に設定すると、すべてのデバッグ出力が可能になります。


必用条件

このモジュールはmod_perl-1.08以上、apache_1.3.0以上を必要とします。そしてmod_perlは適切なコールバック・フックでコンフィグされている必要があります:

  PERL_CHILD_INIT=1 PERL_STACKED_HANDLERS=1. 

参考資料

Apache, mod_perl, DBI


作者

* mod_perl by Doug MacEachern <modperl@apache.org>

* DBI by Tim Bunce <dbi-users@isc.org>

* Apache::AuthenDBI by Edmund Mergl <E.Mergl@bawue.de>


著作権

The Apache::DBI module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。