2

すべてのクラスが共通の基本クラスと定義クラスを使用する DBIC スキーマがあります。基本クラスは共通コンポーネントをロードし、変更セットを監査テーブルに記録するために update メソッドをオーバーライドします。定義クラスは、データベースから生成される静的クラスです。典型的なクラス ヘッダーは次のようになります。

package Schema::Base;

use base 'DBIx::Class::Core';

sub update {
  my $self = shift;

  # track changes to row

  my $instance = $self->next::method(@_);

  # save changeset to audit table

  return $instance;
}


package Schema::Immutable::User;

use Moose;
use MooseX::NonMoose;
use namespace::autoclean;
extends 'DBIx::Class:Core';

__PACKAGE__->load_components("InflateColumn::DateTime");



package Schema::Mutable::User

use base ('Schema::Base', 'Schema::Immutable::User');

sub update {
  my $self = shift;

  # encrypt password

  return $self->next::method(@_);
}

User クラスの更新にオーバーライドを追加するまで、すべてが正常に機能していました。どうやら基本クラスにオーバーライドがあり、 User クラスが何らかの形で競合しています。next::method(@_) を使用して次の更新メソッドを呼び出していますが、常にハングします。

これは CGI アプリケーションです。したがって、「保存」を押すと、エスケープを押してリクエストをキャンセルするまで、ブラウザがホイールを回転させます。この時点で、私のロギングは元に戻り、すべてのクエリが正しく迅速に実行されていることを示していますが、User クラスの最後でハングし、ブラウザーでエスケープを押すまで進行しません。

更新:これは、触媒との相互作用に問題があるようです。単独で実行すると、このコードは正しく機能します。ただし、Catalyst アプリケーション内から実行すると失敗します。

4

1 に答える 1

0

デバッグ中のアプリケーションで、この問題の根本原因を発見しました。元の作成者は、CGI オブジェクトをインスタンス化して着信要求を解析する要求解析オブジェクトを作成していました。ただし、これは触媒と競合するため、クライアントからの要求が終了するまで、要求オブジェクトは車輪を回転させます。どうやら取得する必要があるのは URL とユーザーからの IP だけだったようで、CGI を呼び出さずに環境変数を使用してコードを挿入するのは簡単でした。

于 2010-09-27T13:01:28.457 に答える