我工作的应用程序在15分钟的时间内生成数百个文件(csv)。并且应用程序的后端获取这些文件并对其进行处理(使用这些值更新数据库)。一个问题是数据库锁。
使用数千个文件以避免锁定和有效处理这些文件的最佳做法是什么?
创建单个文件并处理它会更有效吗?或一次处理单个文件?
有哪些常见的最佳做法?
编辑:数据库不是关系型dbms。它是nosql,面向对象的dbms,可以在内存中运行。
答案 0 :(得分:3)
所以,假设您有N-Machines创建文件,并且每个文件在某种意义上是相似的,因为它通常会被消耗到数据库中的相同表中......
我设置了一个Queue,让所有的机器将他们的文件写入队列,然后在另一端有东西从队列中挑选东西,然后将其处理到数据库中。所以,一次一个文件。您甚至可以通过直接写入队列来优化文件操作。
答案 1 :(得分:2)
如果遇到锁定问题,更新的数据库表可能没有适当的索引。获取执行更新的SQL代码,并找出执行计划的内容;如果您使用的是MSSQL,则可以在SSMS中执行此操作;如果UPDATE导致表扫描,则需要添加一个索引来帮助隔离正在更新的记录(除非您更新表中的每个记录;这可能是个问题)。
答案 2 :(得分:1)
对您的具体情况知之甚少......
性能方面,关闭文件可能是您在时间方面执行的最昂贵的操作,所以我的建议是如果您可以使用单一文件路径 - 那么这将是最高效的方法。
答案 3 :(得分:0)
Lock将保护文件不被处理,直到第一个完成。
class ThreadSafe
{
static readonly object _locker = new object();
static int _val1, _val2;
static void Go()
{
lock (_locker)
{
if (_val2 != 0) Console.WriteLine (_val1 / _val2);
_val2 = 0;
}
}
}
答案 4 :(得分:0)
听起来你要么想要一个文件机制,要么让所有文件都从共享的单个目录中消耗掉,该目录不断检查最旧的csv文件并通过你的代码运行它。无论如何,这可能是“最便宜”的解决方案。如果您实际上生成了可以处理的更多文件,那么我可能会重新考虑整个系统架构而不是“创可贴”方法。
答案 5 :(得分:0)
您可以尝试在应用程序代码级别处理并发问题,并强制dbms在更新期间不要锁定对象。
(在RDBMS中,您可以设置最低的事务隔离级别(读取未提交))
如果您可以这样做,另一个选项是截断所有旧对象并批量插入新值。