将数据从c++应用程序写入数据库
Writing data from c++ application to a database
我在C++中有一个应用程序,它需要在数据库中记录大量数据。一般来说,这个任务是直接的,我可以使用c++中的任何数据库连接器来完成任务。
然而,我打算将任务与其他关键路径分离,或者基本上将此实用程序与主应用程序分离。你能提出一个有效的方法吗?还是写数据库本身就足够高效/安全?
我正在考虑将数据写入某个文件,并在后台运行一个单独的脚本,将附加到文件中的数据转储到数据库中。这种做法合理吗?还是对文件的写入与对数据库的写入一样低效/不安全?
感谢
您需要问自己的问题是:
我需要耐用性吗
持久性是ACID事务的一个方面,它本质上意味着当DBMS向客户端发出事务已提交的信号时,该事务所做的更改保证是持久的。因此,即使在提交后立即停电,数据也是安全的。
- 如果答案是"否",那么您可以自由地启动一个后台线程,该线程将写入数据库,可能在"主"处理完成很久之后
- 如果这个问题的答案是"是",那么你别无选择,只能"原地"插入,或者至少在完成"主"处理之前确保背景线程已经完成
在任何情况下,正确地绑定参数和准备INSERT语句都应该有助于提高性能。
如果您采用后台线程路由,您可能希望在数据通过消息队列可用时传递数据,因此对数据库的写入可以与您的"主"处理并行进行。
我有两个建议:
(1.使用单独的低优先级线程进行数据写入
(2.使用单独的进程:生成一个"工作者"或"数据写入器"进程,并通过管道或其他IPC机制向其提供数据。您可以通过单独的低优先级线程来管道传输数据。虽然这比生成线程需要更多的工作,但好处是,如果需要,您可以轻松生成许多工作进程,以便在未来进行扩展。如果您的工作进程崩溃,关键路径仍然不会受到影响。
几年前,我一直在"谋生"很长一段时间,在Sql Server中更新和插入大型数据集,我绝对建议遵循您正在考虑的路线。
对于插入,请在目标表中进行批量复制。
对于更新,请对临时表进行bulkcopyìn,然后发出"update in join"(语法请参阅文档,或SO上的这篇相关文章)。
您需要验证数据库的恢复模式是否合适,以避免事务日志的不必要增长。详细信息因SqlServer版本而异。。。
当我使用它(c中的dblibrary)时,bulkcopy有几个缺点。如果您可以使用托管C++进行编码,我建议您查看提供的类SqlBulkCopy。
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- 在iOS应用程序中创建数据库
- Qt - 共享同一数据库的应用程序
- 如何使用现有的 Sqlite 数据库部署 Qt 应用程序
- 设计一个连接到数据库的应用程序
- 如何制作带有数据库的桌面应用程序,由其他人在不同的计算机上运行
- C :如何在iOS中已经存在的MFC应用程序中的加密SQLITE数据库重复使用
- 如何在小型聊天应用程序中为数据库存储的用户事务建模
- PostgreSQL 的替代方案,用于 C/C++ 应用程序中的嵌入式 SQL 数据库
- 在Windows 8 Metro应用程序中打开外部SQLite数据库
- 在Visual Studio 2012中使用GUI和数据库的Windows应用程序
- 多个应用程序之间的数据库状态
- 当从应用程序多次调用数据库过程时,性能是否会受到影响
- 提高了从客户端应用程序大规模导入MS SQL 2008数据库的速度
- 使用Qt框架减少多线程应用程序中数据库连接的最佳策略
- 当mysql数据库发生更新或更改时,我如何通知我的C或C++应用程序
- Qt:保存Qt-creator应用程序的SQLite数据库的最佳"Path"在哪里?
- 如何从应用程序监视数据库更新
- 将数据从c++应用程序写入数据库
- 用MySql数据库打包c++应用程序