0

我有一个存储在磁盘上的文件,可以跨网络场中的多个服务器访问。该文件会根据数据库中的数据变化进行必要的更新。我有一个数据库表,其中存储了一行,其中包含该文件的 URI 和一些基于一些数据库表的哈希值。如果哈希与其各自的表不匹配,则需要重新生成文件并插入新行。

如何使只有 1 个客户端重新生成此文件并插入一行?

最简单但最糟糕的解决方案(因为锁)是:

BEGIN TRANSACTION
SELECT ROW FROM TABLE (lock the table for the remainder of the transaction)
IF ROW IS OUT OF DATE:
    REGENERATE FILE
    INSERT ROW INTO TABLE
DO SOME STUFF WITH FILE (30s)
COMMIT TRANSACTION

但是,如果多个客户端执行此代码,则所有后续客户端都会在“DO SOME STUFF WITH FILE”处理期间等待很长时间。

有没有更好的方法来处理这个?也许改变我在提交之前处理文件的方式以使其更快?我已经为此困扰了几天。

4

2 回答 2

2

听起来您需要异步进行文件处理,因此文件处理被分拆并且事务及时完成。有几种方法可以做到这一点,但最简单的可能是将“用文件做事”替换为“将记录插入表 This_File_Needs_To_Be_Updated,然后每隔几分钟运行一个作业以更新该表中的每条记录。或者是一些即时生成作业的代码。或者在 Stack Overflow 上查看这个问题。

于 2012-06-10T16:33:58.167 回答
1

答案取决于文件级处理的细节。

如果您只是交换数据库和文件操作,您可能会面临文件损坏或忙于等待的风险(取决于您打开它的方式,以及当并发打开被拒绝时您的代码会做什么)。从吞吐量(或任何其他)的角度来看,繁忙的等待肯定比等待数据库锁更糟糕。

如果您的文件处理确实需要很长时间以至于经常导致请求排队,那么唯一的解决方案是添加更强大的硬件或优化文件级处理。

例如,如果文件只反映数据库中的数据,您可能根本不更新它,并且有一个后台进程根据数据库中的数据定期重新生成其内容。您可能需要添加版本控制,以确保读取文件的人不会收到过时的数据。如果 URL 指向的文件每次都有一个新名称,那么您可能需要一个错误处理程序来确保GET请求不会习惯性地收到404对新文件的响应。

于 2012-06-10T16:20:49.963 回答