[PHP-users 7764] 複数のpg_connect

Nobuyuki.Fukuoka php-users@php.gr.jp
Thu, 30 May 2002 17:44:31 +0900


福岡です。

マニュアルの pg_connect() のページに、
「同じ引数で2回 pg_connect() をコールした場合は新規に接続せずに
接続済みのリソースを返す」旨の記述がありますが、
これって、PHP側の処理ですよね?

PostgreSQL のオンラインマニュアルにも目を通したんですが、
このような記述はなかったようなので質問させていただきます。

仮に、複数のpg_connect()を連続してコールするスクリプトがあったとして
1回コールの場合に比べて速度的にはどうなんでしょう?
劇的に低下しますか?

今、、、、
複数のテーブル(PostgreSQL)へのアクセス用のクラスを
各テーブル用に用意しようと思ってます。
他のRDBへの移行も考えて PostgreSQL に特化したクラスです。
現在は、接続リソースとバージョンアップ時の関数名変更を考慮したメソッド
を含んだ基本クラスを定義し、各テーブル用のクラスのメンバにリファレンスを
保存する様にしてます。

----------------------------------------------------
class    dbc
{
    var $con=NULL;
    function dbc()
    {
        $this->con = pg_connect( "dbname=dbName,user=User,password=pwd" );
    }

    function query( ... )
    {
    }
}

class    table1
{
    var $bObj=NULL;
    function table1( &$basicOBJ )
    {
        if( !is_object( $basicOBJ ) && get_class( $basicOBJ ) != "dbc" ){
            $this->bObj =& new dbc();
        }
        else{
            $this->bObj = $basicOBJ;
        }
    }
    function    select($group,$user)
    {
        ・・・・
        $this->bObj->query( ... );
    }
}

class    table2
{
    function table2( &$basicOBJ )
    {
        if( !is_object( $basicOBJ ) && get_class( $basicOBJ ) != "dbc" ){
            $this->bObj =& new dbc();
        }
        else{
            $this->bObj = $basicOBJ;
        }
    }
    function    select($group,$user)
    {
        ・・・・
    }
}


$dbc =& new dbc;
$table1 =& new table1( $dbc );
$table2 =& new table2( $dbc );

$table1->select( "g1", "kappa" );
$table2->select( "g1", "kappa" );

pg_connect() は1回で済む。
----------------------------------------------------

当初は単純に基本クラスを各テーブルで継承すればすっきりすると思ったんですが、
そこで疑問に思ったのが冒頭の質問です。

----------------------------------------------------
class    dbc
{
    var $con=NULL;
    function dbc()
    {
        $this->con = pg_connect( "dbname=dbName,user=User,password=pwd" );
    }

    function query( ... )
    {
    }
}

class    table1 extends dbc
{
    function    select($group,$user)
    {
        ・・・・
        $this->query( ... );
    }
}

class    table2 extends dbc
{
    function    select($group,$user)
    {
        ・・・・
    }
}

$table1 =& new table1;
$table2 =& new table2;

$table1->select( "g1", "kappa" );
$table2->select( "g1", "kappa" );

インスタンスを作成するたびに pg_connect() が実行されます。
----------------------------------------------------

両方を比べた場合、明らかな速度差は感じられるのでしょうか?
1回コールの方が早いのはわかりますが、さほど差がないのであれば
2番目を採用したいと思ってます。

また、MySQL/SyBase用接続関数のページでも同様に複数回の
接続要求時には接続済みのリソース(リンクID)を返すとありますが、
マニュアルに明記されてない他のRDBでは常に新規に接続される
のでしょうか?(Oracle等)
移植時の互換性が充分でなければ1番目を採用しようと思います。

環境は
Apache/1.3.20 (Unix) PHP/4.2.0 mod_ssl/2.8.4 OpenSSL/0.9.6b
です。

*--------------------------------------------*
  Nobuyuki.KAPPA.Fukuoka
  HomePage : http://kappa.kusukusu.com/
  E-mail(Private) : kappa@air.linkclub.or.jp
  E-mail(Business) : fukuoka@tyo.mind.co.jp
*--------------------------------------------*