私の質問のタイトルは誤解を招くことは可能であるが、ここに行く -非同期クエリ
私は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にしたいかどうかはわかりません。私はそれを試しました、そして、それは助けていないようです。
私はここで何が起こっているのか知りたいです。これを解決する正しい方法は何ですか?
私はそれが理由だと思うし、あなたは頭の中でそれを打った。私は実際にメソッドの外側に$ dbhを作成していました。メソッドの呼び出しに移動しました。アプリケーションは正常に機能しているようです。この洞察のために、まだテストしていますが、本当に感謝しています。 – punkish