我所负责的应用程序在15分钟内会生成数百个文件(csv格式),应用程序的后端会将这些文件进行处理(使用这些值更新数据库)。其中一个问题是数据库锁。
如何处理数千个文件以避免锁定并高效地处理这些文件?
创建单个文件并对其进行处理是否更为高效?还是逐个处理单个文件更好?
有哪些常见的最佳实践方法?
编辑:数据库不是关系型DBMS,而是NoSQL、面向对象的内存数据库。
我所负责的应用程序在15分钟内会生成数百个文件(csv格式),应用程序的后端会将这些文件进行处理(使用这些值更新数据库)。其中一个问题是数据库锁。
如何处理数千个文件以避免锁定并高效地处理这些文件?
创建单个文件并对其进行处理是否更为高效?还是逐个处理单个文件更好?
有哪些常见的最佳实践方法?
编辑:数据库不是关系型DBMS,而是NoSQL、面向对象的内存数据库。
如果您在使用锁时遇到问题,很可能是更新的数据库表没有适当的索引。获取执行更新操作的SQL代码,并查找其执行计划;如果您正在使用MSSQL,则可以在SSMS中执行此操作;如果UPDATE操作导致表扫描,则需要添加一个索引来帮助隔离被更新的记录(除非您正在更新表中的每个记录;那可能会有问题)。
鉴于我对您的具体情况了解有限...
就性能而言,关闭文件可能是您在时间方面执行的最昂贵的操作,因此我的建议是,如果您可以采用单个文件路线,则这将是最高效的方法。
锁定将保护文件,直到第一个文件处理完成。
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;
}
}
}
你可以尝试在应用程序代码层面解决并发问题,并强制 DBMS 在更新期间不锁定对象。
(在关系型数据库中,您可以设置最低的事务隔离级别(读未提交))
如果可以这样做,另一个选项是截断所有旧对象并批量插入新值。