MVCフレームワークの罠

こんにちわ、Takeuchiです。

先日、案件のリリースがあったんですが
結果から言うと、リリースに失敗しました(泣)

資材をリリースした後、DBの負荷が急に上昇し
100%から下がらなくなってしまいました。

案件の内容的には1テーブルの追加とか追加したテーブルの値で
表示するボタンを変更するとか、難しい内容ではなかったんです。

原因の調査を行なっていくなかで分かったことは
案件で使用しているフレームワークがPHPのCakePHPなのですが
このCakePHPはDBと接続を行うMODELが特殊で基本的にはSQLを書きません。
抽出条件となるキーは書きますが抽出系は「find()」、
挿入・更新系は「save()」といった関数を使用してDBとの接続を行います。

また、テーブル同士の紐付けを行うキーは使用するテーブルを
定義する際に記載するのですが、こいつが罠でした。

基本、DBからレコードの抽出を行う際はDBへの負荷を抑えるため
親として使用するテーブルのレコードを絞り込んでから、コードマスタ等の
テーブルと紐付けを行います。
しかし、CakePHPの場合はテーブルを定義する際に紐付け設定を行うために
親テーブルの全レコードと子供のテーブルを紐付けてしまい
CPU・メモリを逼迫させてしまいました。

対処としては、親テーブルと新規追加テーブルの紐付けをやめ
親テーブルと新規追加テーブルへのアクセスを2回に分けることで事なきを得ました。

SQLを書かないフレームワークの場合は
裏でどんなSQLが動いているのか簡単には見えないため
不具合が発生した時に状況を把握するのに時間が掛かります。

開発環境では問題なく動作していたのに、
リリースした途端に不具合を起こして暴走する事だってあります。

リリース後に不具合を出さないようにするためには
開発環境で可能な限り商用と同じレコード数にして
動作及び性能を確認する事です。

リリースに失敗しないためにも
性能検証はしっかりとやっておきましょう。

About the author

take0089

システムの運用、改善、案件対応と幅広くやってる何でも屋
言語はPHP、Java、C#をメインにしつつ最近はPythonも勉強中

Add Comment

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

By take0089

最近の投稿

アーカイブ

カテゴリー

タグクラウド

コーポレートサイト