これは致命的な量だ。
(ノ・・)ン。。。。。。(((●コロコロッ
Ethnaを使用してコードを書くと妙にDBコネクションが多いことに気がつく。
普通に考えればgetDBを使用した時にはじめてコネクションが走るので、
それほど多くはならないはずなのだが。
これはpconnectを使用した方が良いと言うことか?
(MySQLでpconnectを使用するとあっという間に昇天します)
調べてみるといくつか問題点が発見できた。
Ethna_BackendのgetDBが発行されると、
データベース接続が発生する。
この中にconnectメソッドがあり、
このときにデータベースに接続にいくわけだ。
これはこれで問題ないのだが、
複数接続にいかない条件は
'Ethna_backendインスタンスが共通化されている'
ことだ。
少しでもトリッキーな使い方をし始めると、
接続数がどんどん増えていく。
ここはsingletonパターンで実装し直す方が良いと思われる。
こっちは致命的。
ActionとViewの橋渡し的な役割をするEthna_AppManager?。
必ず一つは利用するのだが、
ここに落とし穴がある。
Ethna_AppManager?のコンストラクタにはEthna_BackendのgetDBListメソッドが埋め込まれている。
このgetDBListメソッドは何をしているかというと、
'iniファイルに設定しているすべてのデータベースに接続'
のだ。
getDBを使用してはじめてコネクションが張られる印象だけ持っていても、
AppManger?を設定した時点でコネクションが張られてしまう。
となるとどういう事が起こるかというと、
'データベースを使用しないプログラムでもデータベースに接続される'
例えばWebサーバにキャッシュするプログラムを考えた時に、
初回はDBから取得しそれをキャッシュ。
キャッシュが残っている内はキャッシュした内容を表示するような感じだったとしても、
AppManger?を呼んだ時点でDB接続は行われてしまう。
つまり、DB接続分のオーバーヘッドは必ず発生することになり、
キャッシュプログラム自体の効果が著しく減少する。
さらに、画像処理するプログラムや、
IFrameなどで1ページに複数のプログラムが走っている時はもう目も当てられないぐらいだ。
このgetDBList。
全くと言っていいほど役に立たないメソッドなので、
削除してしまっても構わないと思われる。
少なくともコンストラクタには必要ないはずだ。
function Ethna_AppManager(&$backend) { // 基本オブジェクトの設定 $this->backend =& $backend; $this->config = $backend->getConfig(); $this->i18n =& $backend->getI18N(); $this->action_form =& $backend->getActionForm(); $this->af =& $this->action_form; $this->session =& $backend->getSession(); - $db_list = $backend->getDBList(); - if (Ethna::isError($db_list) == false) { - foreach ($db_list as $elt) { - $varname = $elt['varname']; - $this->$varname =& $elt['db']; - } - } }