【问题标题】:perl DBI and prepared statement name conflictsperl DBI 和准备好的语句名称冲突
【发布时间】:2014-03-07 23:50:48
【问题描述】:

我正在使用 Perl 的 DBI 进行 postgreSQL 访问,我注意到当我有多个并发进程准备同一个查询时,它们似乎最终在服务器上使用相同的预准备语句名称,从而产生冲突。

2014-02-10 10:04:11.802650500 DBD::Pg::st execute failed: ERROR:  prepared statement    "dbdpg_p20307_185" already exists at /usr/sbin/mslrest.pl line 207.
2014-02-10 10:04:11.804659500 [Mon Feb 10 10:04:11 2014] [error] DBD::Pg::st execute failed: ERROR:  prepared statement "dbdpg_p20307_185" already exists at /usr/sbin/mslrest.pl line 207.

有没有办法传入准备好的语句的名称,以便我可以随机化它并避免这种冲突?

【问题讨论】:

  • 我想知道这是否可能是由于在两个进程中使用相同 dbh 的副本(由于分叉)造成的。你是吗?
  • 不确定,我正在使用 Mojolicious::Lite 和 Hypnotoad。它很可能会分叉。我可以尝试重新连接以确保不共享 dbh...
  • 是的,我想就是这样。作为一个快速测试,我重新连接了每个请求,并且没有出现问题。现在我可以提出一个适当的解决方案。谢谢!
  • 你使用的是prepare()还是prepare_cached()?

标签: perl postgresql concurrency dbi


【解决方案1】:

进程的分叉导致每个工作人员具有相同的 dbh。确保每个都是唯一的解决了这个问题。

【讨论】:

    【解决方案2】:

    永远不要将数据库句柄传递给子进程。在子进程中创建句柄应该没问题。

    【讨论】:

      【解决方案3】:

      对于我的 Mojolicious 应用程序,我使用了 DBIx::Connector.

      每当我需要一个数据库连接时,我都会向连接器实例请求一个。自动处理断开连接和分叉。

      【讨论】:

        猜你喜欢
        • 2016-04-18
        • 2014-04-17
        • 2013-10-05
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多