2011-07-17 36 views
1

私の質問のタイトルは誤解を招くことは可能であるが、ここに行く -非同期クエリ

私は3のMySQL/Perl DancerパワードWebアプリケーションを伴うプロトタイプアプリをしようとしています。

ユーザーはGoogleマップの基本レイヤーを提供するアプリAに行きます。準備文書では、アプリAが3つのjQueryのAJAX呼び出しを行う - 2、アプリBにそう

http://app_B/points.json 
    http://app_B/polys.json 

と1つのアプリのCへ

http://app_C/polys.json 

アプリBとCのクエリDBI経由でMySQLデータベース、およびようにユーザーのブラウザにレンダリングされるポイントとポリゴンのjsonパケットを配信します。

すべての3つのアプリケーションがplackup経由で実行されているPerlのスターマンにはApacheを介してプロキシされているが、時間にそう

$ plackup -E production -s Starman -w 10 -p 5000 path/to/app_A/app.pl 
    $ plackup -E production -s Starman -w 10 -p 5001 path/to/app_B/app.pl 
    $ plackup -E production -s Starman -w 10 -p 5002 path/to/app_C/app.pl 

時からのように始めた、私は戻ってAjaxを経由して呼び出されるアプリケーションからのエラーを取得を開始します。初期症状は

{"error":"Warning caught during route 
    execution: DBD::mysql::st fetchall_arrayref 
    failed: fetch() without execute() at 
    <path/to/app_B/app.pm> line 79.\n"} 

問題のある行が

71> my $sql = qq{ 
    72>  .. 
    73> 
    74> 
    75> }; 
    76> 
    77> my $sth = $dbh->prepare($sql); 
    78> $sth->execute(); 
    79> my $res = $sth->fetchall_arrayref({}); 

ですし、これは()の実行上の場所を取ることができないか...奇妙なのですか? Perlには行間を飛び越える習慣はありませんか?だから、私はDBI_TRACEオン

$DBI_TRACE=2=logs/dbi.log plackup -E production -p 5001 -s Starman -w 

10 -aビン/ app.pl

そして、次は、ログファイル内の潜在的な原因として私に際立っていたものです

> Handle is not in asynchronous mode error 2000 recorded: Handle is 
    > not in asynchronous mode 
    > !! ERROR: 2000 CLEARED by call to fetch method 

何やっている?基本的には、アプリケーションAは機能しません。なぜなら、他のアプリは「信頼できる」データを返していないからです。私はそれらを時々正しく動作させるので引用符で囲みます。私のコードで。私は何らかの本質的な配管エラーがあります。

私はDBD::mysql about ASYNCHRONOUS_QUERIESで次を見つけました。これが原因で問題が解決したのかどうか疑問に思っています。基本的に、asyncクエリが必要な場合は、{async => 1}$dbh-prepare()に追加する必要があります。ただし、非同期をtrueまたはfalseにしたいかどうかはわかりません。私はそれを試しました、そして、それは助けていないようです。

私はここで何が起こっているのか知りたいです。これを解決する正しい方法は何ですか?

答えて

3

データベースハンドルをどのように管理していますか? starmanがあなたのコードをフォークする前に接続を開くと、複数の子供が1つのデータベースハンドルを共有しようとしている可能性があり、MySQLを混乱させます。この問題を解決するには、データベースと対話する方法で常にDBI->connectを実行しますが、これは非効率的です。多くの人が何らかの接続プールに切り替わりますが、私はそれらのどれとも直接の経験はありません。

+0

私はそれが理由だと思うし、あなたは頭の中でそれを打った。私は実際にメソッドの外側に$ dbhを作成していました。メソッドの呼び出しに移動しました。アプリケーションは正常に機能しているようです。この洞察のために、まだテストしていますが、本当に感謝しています。 – punkish