繁体   English   中英

数据库各种连接与一对

[英]Database various connections vs. one

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

数据主要是文本,因此它是比较重的数据。

该过程一次由成千上万个寄存器组成。 用户可以选择要启动的寄存器数量。 数据从一张表获得,在该表中将其标记为“完成”。 没有“ WHERE”条件,但可选的“ DATE1 AND date2之间的WHERE日期”除外。

我们争论哪种方法更好:

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

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

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

在这种情况下,可靠性重要吗? 如果该过程终止,您是否可以重新处理所有内容? 可以吗

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

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

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

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

接着

  1. 处理记录
  2. 更新记录内容,并且
  3. 将状态设置为“完成”,或在出现错误的情况下将其设置为“错误”。

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

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

如果数据繁重而负担也很大,则考虑到应用程序不是实时依赖的,最好的方法是确定地获取所需的数据并对其进行处理,然后再放回去。

从效率上来说,无论使用哪种语言,如果您打开单个项目并单独处理它们,则可能正在关闭数据库连接。 这意味着,如果您有1000个项目,则将打开和关闭1000个连接。 这样的开销远远大于返回所有项目并对其进行处理的开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM