MapServerのデータベースへの持続的接続
kokogikoさんのサイトで、MapServerのパフォーマンスを調査しており、興味深い情報を公開していただいています。そのなかでMapServerの動作にたいする疑問点を3点ほど提示しています。
詳しくは、kokogikoさんのMapServerのパフォーマンスを読んでいただくとして、このエントリでは個人的にも前から気になっていた。
1.PostGISを使う場合のMAPFILEなんだけど、
LAYER
NAME "道路"
CONNECTION "user=XXXX password=XXXX dbname=XXXX host=localhost port=5432"
CONNECTIONTYPE postgis
DATA "the_geom from dourokukan"
〓中略〓
ENDみたいなふうになっている。
つまり、DBへのコネクションの設定は、ファイル単位じゃなくて、レイヤー単位で設定されているという事。
これってもしかして、本当はアクセス毎にDBに接続どころか、同じアクセスの中でもレイヤー毎に接続してるって事なんだろうか?
ちゃんと同じ接続文字列なら、せめて同一アクセス内くらいは同じ接続の使い回し、とかしてくれてるのかなあ?
について書いてみます。
PostgreSQLの場合にはデータベースの接続のオーバヘッドはばかにならないと、識者の方がよく啓蒙しているので、MapServerのLayerごとに毎回接続のオーバーヘッドがあるとしたら良くないなぁと感じていました。いい機会なのでMapServerのソースコードをちょこっとだけのぞいてみました。
結論だけですが、mapfile.cのソース内にあるmsCheckConnection()という関数で、PostgreSQL,MySQL,ESRI SDE,は、以前の接続の確認を行い、同じDBに接続している場合は、使いまわしているようです。Oracleについては、よく分かりませんでした。
というわけで、PostgreSQL等ではしっかりと接続を保存しておりレイヤーごと無駄な接続は行われていないようです。