[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
*--------------------------------------------*