gpt4 book ai didi

mysql - 使用 MySQL/Perl DBI 进行异步查询

转载 作者:行者123 更新时间:2023-11-29 04:55:44 26 4
gpt4 key购买 nike

我的问题标题可能具有误导性,但这里是 --

我正在尝试一个涉及三个 MySQL/Perl Dancer 的原型(prototype)应用程序强大的网络应用程序。

用户转到提供 Google map 基础层的应用程序 A。在文档准备就绪时,应用程序 A 进行了三个 jQuery ajax 调用——两个像这样调用到应用程序 B

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

还有一个到应用程序 C

    http://app_C/polys.json

应用 B 和 C 通过 DBI 查询 MySQL 数据库,并提供在用户浏览器中呈现的点和多边形的 json 数据包。

所有这三个应用程序都通过 Apache 代理到 Perl Starman,通过 plackup 启动运行

    $ 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({});

这很奇怪……execute() 怎么可能不在上面发生呢? Perl 没有跳过行的习惯,是吗?所以,我开启了DBI_TRACE

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

10 -a bin/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()。除了,我不确定我想要异步真还是假。我试过了,它似乎没有帮助。

我很想知道这里发生了什么,以及解决这个问题的正确方法是什么。

最佳答案

您如何管理数据库句柄?如果您在 starman fork 您的代码之前打开一个连接,那么多个 child 可能会试图共享一个数据库句柄并且混淆 MySQL。您可以通过始终在与数据库对话的方法中运行 DBI->connect 来解决此问题,但这可能效率低下。许多人转而使用某种连接池,但我对其中任何一个都没有直接经验。

关于mysql - 使用 MySQL/Perl DBI 进行异步查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6721057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com