数据库各种连接与一个

时间:2009-09-07 18:02:10

标签: php database postgresql

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

数据主要是文本,因此数据非常繁重。

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

我们争论哪种方法更好:

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

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

2 个答案:

答案 0 :(得分:1)

这真的取决于您对数据的关注程度(严重):

在这种情况下,可靠性是否重要?如果这个过程死了,你能重新处理一切吗?或者不是吗?

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

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

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

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

    1. 处理记录
    2. 更新记录内容,AND
    3. 将状态设置为“完成”,或者在出现错误时设置为“错误”。
    4. 您可以同时运行此代码,而不必担心它会自行运行。您将能够确信相同的记录不会被处理两次。

      您还可以看到任何“未成功”的记录,因为它们的状态为“正在处理”,并且有任何错误。

答案 1 :(得分:0)

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

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