将数据从c++应用程序写入数据库

Writing data from c++ application to a database

本文关键字:数据库 应用程序 c++ 数据      更新时间:2023-10-16

我在C++中有一个应用程序,它需要在数据库中记录大量数据。一般来说,这个任务是直接的,我可以使用c++中的任何数据库连接器来完成任务。

然而,我打算将任务与其他关键路径分离,或者基本上将此实用程序与主应用程序分离。你能提出一个有效的方法吗?还是写数据库本身就足够高效/安全?

我正在考虑将数据写入某个文件,并在后台运行一个单独的脚本,将附加到文件中的数据转储到数据库中。这种做法合理吗?还是对文件的写入与对数据库的写入一样低效/不安全?

感谢

您需要问自己的问题是:

我需要耐用性

持久性是ACID事务的一个方面,它本质上意味着当DBMS向客户端发出事务已提交的信号时,该事务所做的更改保证是持久的。因此,即使在提交后立即停电,数据也是安全的。

  • 如果答案是"否",那么您可以自由地启动一个后台线程,该线程将写入数据库,可能在"主"处理完成很久之后
  • 如果这个问题的答案是"是",那么你别无选择,只能"原地"插入,或者至少在完成"主"处理之前确保背景线程已经完成

在任何情况下,正确地绑定参数和准备INSERT语句都应该有助于提高性能。

如果您采用后台线程路由,您可能希望在数据通过消息队列可用时传递数据,因此对数据库的写入可以与您的"主"处理并行进行。

我有两个建议:

(1.使用单独的低优先级线程进行数据写入

(2.使用单独的进程:生成一个"工作者"或"数据写入器"进程,并通过管道或其他IPC机制向其提供数据。您可以通过单独的低优先级线程来管道传输数据。虽然这比生成线程需要更多的工作,但好处是,如果需要,您可以轻松生成许多工作进程,以便在未来进行扩展。如果您的工作进程崩溃,关键路径仍然不会受到影响。

几年前,我一直在"谋生"很长一段时间,在Sql Server中更新和插入大型数据集,我绝对建议遵循您正在考虑的路线。

对于插入,请在目标表中进行批量复制。

对于更新,请对临时表进行bulkcopyìn,然后发出"update in join"(语法请参阅文档,或SO上的这篇相关文章)。

您需要验证数据库的恢复模式是否合适,以避免事务日志的不必要增长。详细信息因SqlServer版本而异。。。

当我使用它(c中的dblibrary)时,bulkcopy有几个缺点。如果您可以使用托管C++进行编码,我建议您查看提供的类SqlBulkCopy。