我有一个C ++应用程序需要在数据库中记录大量数据。一般来说,这个任务是直截了当的,我可以在c ++中使用任何数据库连接器并完成工作。
但是,我打算将任务与其他关键路径分开,或者基本上将此实用程序与主应用程序分开。你能建议一个有效的方法吗?或者写入数据库本身是否有效/足够安全?
我正在考虑将数据写入某个文件并在后台运行单独的脚本来转储附加到数据库中文件的数据。这是一种合理的方法吗?或者写入文件与写入数据库同样效率低/不安全?
谢谢
答案 0 :(得分:2)
您需要问自己的问题是:
我需要耐久性吗?
持久性是ACID事务的一个方面,它实质上意味着当DBMS向客户端发出事务已提交的信号时,该事务所做的更改将保证是持久的。因此,即使在提交后立即停电,数据也是安全的。
在任何情况下,正确绑定参数和准备INSERT语句都应该有助于提高性能。
如果你去后台线程路径,你可能想要通过消息队列传递数据,因此写入数据库可以与你的“主要”处理同时进行。
答案 1 :(得分:1)
我有两点建议:
(1.使用单独的低优先级线程进行数据写入
(2.使用单独的流程:产生"工人"或"数据写入器"处理并通过管道或其他IPC机制提供数据。您可以管道数据通过一个单独的低优先级线程。 虽然这比产生线程更有效,但是如果需要的话,您可以轻松地生成许多工作进程以便在将来进行扩展。如果您的员工崩溃,关键路径仍然没有受到影响。
答案 2 :(得分:0)
几年前我一直在'生活',在Sql Server中更新和插入大型数据集,我绝对建议你按照你想要的路线。
对于目标表中的插入,批量复制。
对于更新,批量复制“在临时表格中”,然后发出“加入时更新”(请参阅文档中的语法,或this相关帖子上的内容)。
您需要验证数据库的恢复模式是否合适,以避免不必要的事务日志增长。详细信息因SqlServer版本而异......
当我使用它时(c中的dblibrary),bulkcopy有几个缺点。如果您可以使用托管C ++编写代码,我建议您查看提供的类SqlBulkCopy。