我正在编写一个C ++程序,我有一个类为程序中的其余部分提供服务。
我现在写的是clases和UML。 1)我所引用的类有一个随时间变化的任务列表,并且正在这个列表中检查条件,我想将它保存在数据库中的一个表中,表中的每一行都代表一个任务,这个如果程序崩溃或停止工作我可以恢复最后一种情况,另一种选择是将任务列表保存在内存中并在数据库中保留一份副本。
应该每秒搜索一次任务列表 更推荐哪种方法?
2)为了写入和读取数据库,我可以直接从类中调用数据库或构建数据库通信类,如果我编写数据通信类,我需要提供特定的选项并构建一个迷你服务器为了这, 例如写一行到数据库,读一行到数据库,只更新第一列等。
推荐的方法是什么? 感谢。
答案 0 :(得分:0)
在数据库中保存信息只是为了恢复崩溃的信息可能有点过分。
理想情况下,您希望序列化列表并将其保存为基于二进制,xml或csv的值。这可以基于计时器或应用程序中的某些事件来完成。
如果您可以提供一个看起来与表完全相似的结构,也可以使用数据库 - 这样您就可以在对象之间进行一对一映射,并且可以轻松地编写SQL查询。但请将其保留在单独的抽象层上。
答案 1 :(得分:0)
首先,如果数据库显而易见且没有性能问题,那就这样做吧。你说的是运行一次/秒的查询,并且可能标记任务或者每隔一段时间添加一个新任务;即使是缓慢的SMB共享上的sqlite也应该能够正常处理。
如果确实需要对其进行优化,那么有两种方法:既可以使用数据库,也可以将其缓存在内存中,或者将内存用作主存储,并提供使用数据库的持久性机制。但是,除非你需要优化它,否则不要。
接下来,你应该怎么做?您的问题听起来像是在考虑整个三层系统,在数据库服务器和任务列表之间有一个“迷你服务器”。真的没有必要。你想要的是一个定制的ORM,但这让它听起来比它更复杂。您所做的只是编写一个包装数据库连接的类,并提供一些方法 - get_due
,mark_done
,add
,get_next_id
- 每个方法都映射SQL Task
成员的参数。例如(没有错误处理):
void mark_done(Task task) {
db.execute("UPDATE Task SET done=true WHERE id=%s", task.id);
}
还有三个这样的方法,加上一个连接到数据库的构造函数(包括创建Task
表,如果它还没有存在),你的类就完成了。
您不希望将数据库内容直接写入Task
的原因是您实际上没有任何地方可以存储数据库连接对象等共享信息;要么你需要全局变量(或类属性,它们实际上是全局变量),要么你需要在每个Task
实例中使用副本(或者,实际上,弱引用 - 你将使用引用或原始伪造指针,无论哪种方式都会导致关机问题。
最后,您执行此操作的全部原因是错误恢复,数据库在日记功能方面做得很好,所以没有任何不一致,但您必须确保构建应用程序以利用它。例如,您可能希望在“正在处理”中标记所有现在到期的任务,然后处理它们,然后将它们全部标记为“完成”;这样,在恢复时,您确切地知道哪些任务可能已经完成或可能没有完成,并且可以采取适当的行动。您可以提交到数据库的步骤越多,您需要处理的数据丢失就越少 - 但当然您需要编写的代码越多,而且速度越慢。所以,尽可能多地做,但不多做。