mod_perl 2.0 の Server Life Cycle

mod_perl 2.0 のサーバ起動にまつわる文書を読み込んでいました。

  • サーバスタートアップスクリプトは,1.0 時代のドキュメントでは「PerlRequire」記述子で読み込むように書かれていることが多いが,実行される時点が中途半端。なので,PerlPostConfigRequire を使う方が吉。もし設定ファイル自体で Perl の機能を利用しているのであれば(普通そこまでコアなことやらなくて済むんだけど),PerlConfigRequire を使うとサーバ設定フェイズ(すなわちかなり早い段階)で実行される。
  • Apache 2.x では,graceful restart がうまくいくことの確証を得るために,一度サーバ設定フェイズが終わると,Apache 自身を再起動する。ということは,サーバ起動時に,スタートアップスクリプト等は 2 回実行される。このことで困るってことはたいていないんだけど,スタートアップスクリプトでログ吐きとかやってるとあれれ?と思うかも。
  • かくなるように,スタートアップスクリプトは基本的にマスタサーバプロセスの起動時,再起動時にしか実行されない(と思う)。どういうことかというと,MaxRequestsPerChild を超えたために子プロセス等が再起動した場合でも実行はされない(と解釈しました)。
  • だから,プロダクションサーバ等で DBIx::Class::Schema を継承したクラスみたいに重い*1モジュールはスタートアップスクリプトのほうで読み込んでおくとよい,と,思,い,ます。


おまけで,中途半端ながら上記文書の「mod_perl Startup」節の抄訳をあげておきます。今回は全然推敲してないです。

*1:いやほんとに重いですね。プロファイリングしたところ Class::C3 のせいっぽい。ということは Perl 6 になると改善されるのでしょうか。

続きを読む

DBDesigner 4 での UNIQUE 制約に挑戦

現在のプロジェクトでは DBDesigner 4 をデータモデリングツールとして使っているのですが,フィールドの属性として「UNIQUE」をつけられないので困っていました。UNIQUE INDEX なら貼れるのですが(そしてそれでたしかに十分なのですが)たまたまインデックスはいらないけど UNIQUE 制約をつけたい状況がありまして,いろいろ試行錯誤していたところなんとかできました。

DBDesigner4_DatabaseInfo.ini という設定ファイルをいじる必要があるのですが,ちょっと複雑なことに,DBDesigner 4 では,アプリケーションのあるフォルダからユーザのフォルダ(Windows 2000 以降であれば C:\Documents and Settings\ユーザ名\Application Data\DBDesigner4)に設定ファイルがコピーされるんですね。なので,(もしまだ起動したことがなければ)アプリフォルダの設定ファイルを書き換えるなり,ユーザフォルダの設定ファイルを書き換えるなり,両者とも書き換えるなりしてください。

この ini ファイルに [MySQL_ほにゃららTypes] というセクションがあるので,がりがり書き換えていきます。たとえば TINYINT 型で UNIQUE 制約をサポートしたい場合,もともと

Field1=TINYINT[(length)] [UNSIGNED!] [ZEROFILL] 
// A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.

といった設定が書いてあるかと思いますが,

Field1=TINYINT[(length)] [UNSIGNED!] [ZEROFILL] [UNIQUE]
// A very small integer. The signed range is -128 to 127. The unsigned range is 0 to 255.

のように「[UNIQUE]」というタグを付け加えてやります(タグ値の最後に!をつけると,デフォルトで選択された状態になります)。新しくモデルファイルを作って新規テーブルのフィールドタイプを TINYINT にしてやると,フィールド属性として UNIQUE のチェックボックスが出現するようになります(残念ながら属性の欄が短すぎて全部でてきませんが)。

ちなみに GUI からこの属性値を追加することもできますが,追加したい値種別がいっぱいあるので ini ファイルを書き換える方法をご紹介しました。これで万事オッケーだとおもいま…えっ?既存のモデルファイルを開いても UNIQUE が選択肢にでてこない?

この場合は,めんどうですが,モデルの xml ファイルを開くと

<DATATYPE ID="1" IDGroup="0" TypeName="TINYINT" Description="〜略" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="1" />
<OPTION Name="ZEROFILL" Default="0" />
</OPTIONS>
</DATATYPE>

のように,データ型が定義されているので,

<DATATYPE ID="1" IDGroup="0" TypeName="TINYINT" Description="〜略" >
<PARAMS>
<PARAM Name="length" />
</PARAMS>
<OPTIONS>
<OPTION Name="UNSIGNED" Default="1" />
<OPTION Name="ZEROFILL" Default="0" />
<OPTION Name="UNIQUE" Default="0" />
</OPTIONS>
</DATATYPE>

のように,UNIQUE 属性の OPTION を追加してください。

追記 2006/06/08

既存のモデルファイルこそ GUI でいじるべきかも。右のサイドバーに「Data Type」という項があるので,データ型をダブルクリックすると「Options」という項目がありますからそこに UNIQUE を追加すれば OK です。

しかしこれらのアプローチがいまいち有効じゃなかったことを今日発見しました。UNIQUE 制約修飾子が NOT NULL 制約より前にきてしまうので,sqlt に怒られてしまいます。
単に SQL::Translator::Parser::MySQL がフィールドの UNIQUE 属性をサポートしていないだけでした。rt.cpan.org 見ても多くのバグが放置されぱなっしですし,変な T シャツ作って喜んでいるばあいではないと思いました。といいつつ,実は CVS 版では修正されまくっているんで新リビジョンのリリースが待ち遠しいですね。