【PHP】同じ接続先のDBコネクションが複数ある場合

PHPのドキュメントに以下のような文章がある。

持続的接続は、スクリプトの実行終了時にも閉じられないリンクです。 持続的接続が要求された時、PHPは(前もってオープンされたままになって いる)同じ持続的接続が既にオープンされていないかどうかを確認します。
そして、存在する場合には、それを使用します。存在しない場合には、そ のリンクを作成します。
‘同じ’接続とは、同じホスト、同じユーザー名、 同じパスワード(利用可能な場合)でオープンされた接続のことを意味します。

これはいったいどういうこっちゃ?ってことで調べてみた。

同じ接続情報で接続した場合

[php]
$conn = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD");
echo pg_connection_status($conn);//PGSQL_CONNECTION_OK
$conn2 = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD");
echo pg_connection_status($conn2);//PGSQL_CONNECTION_OK
[/php]
ここまでは別段問題はない。
で、クエリ処理を行っていざクローズという時に変なことが起こる。
[php highlight=”2″]
pg_close($conn);
echo pg_connection_status($conn);//PGSQL_CONNECTION_OK
pg_close($conn2);
echo pg_connection_status($conn);//PGSQL_CONNECTION_BAD
[/php]
ん?2行目でcloseしたはずの$connがとじていないぞ?
しかも$conn2をクローズして初めて$connがクローズされるようだ。

これがドキュメントにある、同じ持続的接続がある場合、再利用するってことなんだな。

異なるユーザで接続した場合

先にこっちを載せておいたほうが良かったかな。
[php]
$conn = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD");
pg_connection_status($conn);//PGSQL_CONNECTION_OK
$conn2 = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME2 password=PASSWORD2");
pg_connection_status($conn2);//PGSQL_CONNECTION_OK

//クエリ処理

pg_close($conn);
echo pg_connection_status($conn);//PGSQL_CONNECTION_BAD
pg_close($conn2);
echo pg_connection_status($conn);//PGSQL_CONNECTION_BAD
[/php]
これはそのまんま。問題ないね。

同じ接続情報で接続した場合 パート2

PHPのPostgreSQL接続に関するドキュメントに以下の内容があった。

同じ connection_string 引数で 2 回 pg_connect() 関数がコールされた場合は、 connect_type に PGSQL_CONNECT_FORCE_NEW を指定していない限り 既存の接続が返されます。

つまりは最初の例でも

[php highlight=”3″]
$conn = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD");
echo pg_connection_status($conn);//PGSQL_CONNECTION_OK
$conn2 = pg_connect("host=localhost port=5432 dbname=DB_NAME user=USER_NAME password=PASSWORD", PGSQL_CONNECT_FORCE_NEW);
echo pg_connection_status($conn2);//PGSQL_CONNECTION_OK
[/php]
こうやってやることによって$conn$conn2は全く別のコネクションとなりクローズ処理も別々にやる必要がでてくる。

まとめ

大規模開発においてはDBの接続先が複数発生する場合が多々ある。そこで(プログラムにおける)DBリソースの管理は適切に行わなう必要がある。

なるべく、同じ接続先には同一コネクションを再利用することを心がけ、限りある資源は有効に活用しましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です