Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 上载日志(.txt文件)与在数据库中为每个事件插入1条记录相比,记录日志的效率更高_C#_Sql Server_Text Files - Fatal编程技术网

C# 上载日志(.txt文件)与在数据库中为每个事件插入1条记录相比,记录日志的效率更高

C# 上载日志(.txt文件)与在数据库中为每个事件插入1条记录相比,记录日志的效率更高,c#,sql-server,text-files,C#,Sql Server,Text Files,我正在尝试在数据库中记录日志文件。我的问题是,在数据库上创建日志的负载越小。我正在考虑为库存计划存储长期日志文件,可能最多3-5年 过程:我将使用条形码扫描仪。 扫描完条形码后,我将获得登录者的所有详细信息、日期和时间以及每件商品的产品详细信息 我想出了两个主意 扫描事件后,它将保存在数据表上,然后在完成一批后保存DataTable将写入*.txt文件,然后上载到我的数据库 每次扫描条形码后,将执行插入查询我怀疑这个选项在服务器端会很重要,因为我不是唯一一个使用这个服务器的人 这两种选择的优缺点

我正在尝试在数据库中记录日志文件。我的问题是,在数据库上创建日志的负载越小。我正在考虑为库存计划存储长期日志文件,可能最多3-5年

过程:我将使用条形码扫描仪。 扫描完条形码后,我将获得登录者的所有详细信息、日期和时间以及每件商品的产品详细信息

我想出了两个主意

  • 扫描事件后,它将保存在
    数据表上,然后在完成一批后保存
    DataTable
    将写入
    *.txt
    文件,然后上载到我的数据库
  • 每次扫描条形码后,将执行插入查询我怀疑这个选项在服务器端会很重要,因为我不是唯一一个使用这个服务器的人
  • 这两种选择的优缺点是什么?
    是否有更有效的方式存储日志

    这两种选择的利弊是什么

    基本上,您的问题是哪种方式更有效(批量插入多单次插入

    答案总是根据具体情况而定。所以不幸的是,我认为没有一个正确的答案

  • 构造日志表的方式
  • 如果选择批量插入,一次要插入多少行
  • 是只读表吗?如果你想阅读,你多久读一次
  • 你需要扩大规模吗
  • 等等
  • 是否有更有效的方式存储日志

    我可以想出一些可能的改进方法(并非所有方法都能协同工作)

  • 如果您选择第一个选项,可能可以将插入时间安排到非高峰时间
  • 如果使用第一个选项,请将日志文件分块并进行插入
  • 使用另一个数据库进行日志记录
  • 如果使用第二个选项,请执行一些负载测试
  • 就我个人而言,如果项目是中小型的,并且日志记录是项目的关键部分,我更愿意选择第二个选项


    希望有帮助。

    使用第二个选项,使用事务。这样,在调用事务完成之前,数据不会发送到db。(可以安排。)这还可以防止在发生崩溃或其他情况时损坏的数据进入数据库


    < P>根据您的用例,我也认为您至少需要考虑2个额外的因素,第一个是扫描项目在数据库中立即登录是多么重要。如果您需要记录扫描的项目,因为您将检查它是否已被扫描,例如,为了防止其他扫描,那么执行单个插入可能是一个非常好的主意。要考虑的第二件事是,你是否需要“取消扫描”一个项目,以及在哪个过程中?如果扫描人员需要立即恢复扫描,最好等到他们完成所有扫描后再将数据转储到数据库,这样可以避免从表中删除数据

    总的来说,我不会太担心数据库能处理什么,sql server非常擅长处理为该用例设计的表中的同时单次插入。如果只在表的末尾插入新数据,而不更新或删除现有记录,那么性能将得到很好的扩展。对于较大的批插入也是如此,假设您的表是为此目的而设计的,那么无论您要引入多少行,批插入都非常有效


    因此,总的来说,我可能会从应用程序端为您的特定用例选择更有效的解决方案,然后,一旦您决定了这一点,您就可以围绕代码来塑造数据库,而不是试图围绕数据库的可疑限制来塑造您的代码。

    使用第二种方法。这确实是使用数据库的正确方法--扫描数据并将其放入安全、符合ACID的存储中。可以接受的数据丢失量是多少?什么级别的延迟是可接受的?(延迟=扫描事件和数据库中出现的日志之间的时间)。我建议你去排队。扫描器将其单个日志事件抛出到队列中—它对数据库一无所知。SQL Server从队列中读取内容—它对扫描仪一无所知。如果任何一方都存在某种吞吐量不匹配,队列将处理它。您的选项1是一个在扫描器侧设置的队列,但我在中间收集一个独立的队列。@ NIC.McDeMIDID,从我收集到的,不应该有数据丢失。数据丢失将导致不应该存在的差异。关于延迟,它应该是相对短的时间量(0.5MS~2SEC)。。感谢您提供的见解。这通常是一个问题:您希望额外的百万美元带来0.1%的可能数据丢失还是0.001%的可能数据丢失?所谓延迟,我的意思是:在扫描活动和最终用户在其报告中看到它之间。您真的需要最终用户报告中显示的扫描速率不超过2秒吗?您的数据表/txt文件方法本身就意味着超过2秒的延迟。另一个问题是,您是否希望看到历史趋势以及持续多长时间?这三个元素(数据丢失、延迟、历史)所有这些都是有成本的,企业应该明白这一点。感谢您的启发。该项目对于企业级来说是巨大的。是的,日志对于检查、进度和效率报告来说是至关重要的。谢谢您。但是,我担心的不是数据库的局限性,而是服务器能够处理的流量。但这是专业的bably现在不在我的问题中。@Hexx这可能是一个因素,但作为一个例子,我使用的是日志da