【问题标题】:Database various connections vs. one数据库各种连接与一个
【发布时间】:2009-09-07 18:02:09
【问题描述】:

我们有这个 PHP 应用程序,它从数据库中选择一行,对其进行处理(调用使用 Web 服务的外部 API),然后根据完成的工作插入一个新寄存器。有一个 AJAX 显示通知用户已经处理了多少寄存器。

数据多为文本,数据量较大。

该过程一次由数千个寄存器组成。用户可以选择开始工作的寄存器数量。数据是从一个表中获得的,在表中它们被标记为“完成”。没有“WHERE”条件,除了可选的“WHERE date BETWEEN date1 AND date2”。

我们争论过哪种方法更好:

  • 选择一个寄存器,处理它,然后插入新数据
  • 选择所有寄存器,在内存中使用它们,并在所有工作完成后将它们插入数据库中。

对于使用 PHP 和 PostgreSQL 的 Web 环境,您认为哪种方法最有效?为什么?

【问题讨论】:

    标签: php database postgresql


    【解决方案1】:

    这真的取决于您对数据的关心程度(认真):

    在这种情况下,可靠性重要吗?如果进程死了,你可以重新处理所有内容吗?还是不能?

    通常在调用远程 Web 服务时,您不希望为同一个数据项调用两次。也许有副作用(比如信用卡费用),或者它不是免费的 API……

    无论如何,如果您不关心潜在的重复处理,请采用批处理方法。这很容易、简单、快速。

    但如果您确实关心重复处理,请执行以下操作:

    1. 从表中选择 1 条记录 FOR UPDATE(即,将其锁定在事务中)
    2. 更新状态为“处理中”的记录
    3. 提交该事务

    然后

    1. 处理记录
    2. 更新记录内容,并且
    3. 将状态设置为“完成”,如果出现错误,则设置为“错误”。

    您可以同时运行此代码,而不必担心它会自行运行。您将可以确信同一条记录不会被处理两次。

    您还可以看到任何“未成功”的记录,因为它们的状态将是“处理中”以及任何错误。

    【讨论】:

    • 我认为批处理方法的优势足以令人信服。我已经以这种方式实现了它。它是一个网络应用程序,所以我认为一次加载所有数据可能对服务器的内存非常不利,对吧?
    【解决方案2】:

    如果数据很重,负载也很重,考虑到应用程序不是实时依赖的,最好的方法肯定是获取所需的数据并处理所有数据,然后将其放回去.

    从效率上讲,无论语言如何,如果您打开单个项目并单独处理它们,您可能正在关闭数据库连接。这意味着如果您有 1000 个项目,您将打开和关闭 1000 个连接。这方面的开销远远超过返回所有项目并处理它们的开销。

    【讨论】:

    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多