2009-11-09 61 views
2

美好的一天,我从通信通道接收数据并显示它。并行,我将它序列化成一个SQLite数据库(使用普通的SQL INSERT语句)。在我的应用程序退出后,我在sqlite对象上执行了一个.commit。如何可靠地序列化数据

如果我的应用程序在中间被残忍地终止会发生什么?即使没有.commit,最新的(合理的 - 不是说100微秒前,但至少在一秒前)数据在数据库中安全吗?或者我应该定期提交?做这些事情的最佳模式是什么?


我试过(源码的选项)自动提交,并通过一个因素这减慢代码很多〜55(自动提交对只有一个提交的结束)。每完成100次插入就会使性能在最佳模式的20%以内。所以自动提交对我来说非常慢。

我的应用程序将大量数据泵入数据库 - 我能做些什么来使其运行良好?

回答

1

您应该在每次完成逻辑更改时执行COMMIT。

交易的一个原因是为了防止未提交的交易数据从外部可见。这很重要,因为有时单个逻辑更改可以转换为多个INSERT或UPDATE语句。如果交易后面的其中一个查询失败,交易可以通过ROLLBACK取消,并且根本不记录任何更改。

一般而言,在COMMIT成功之前,数据库中不会记录事务中执行的更改。

没有这大大减慢我的代码? - zaharpopov

频繁提交,可能放慢你的代码,并作为优化你可以尝试分组在一个事务中的几个逻辑变化。但是这与交易的正确使用背道而驰,你应该在测量之后这样做才能显着提高性能。

+0

这不会显着减慢我的代码? – zaharpopov 2009-11-09 12:47:09

3

您应该在transaction范围内执行此操作,并因此在过程中的适当位置执行commit。交易将保证此操作是atomic - 即它可以工作或不工作。

原子性规定,数据库 修改必须遵循“全或无 ”规则。每笔交易是 据说是“原子”,如果当交易的一部分 失败时,整个交易都会失败 。尽管存在任何DBMS, 操作系统或硬件故障,数据库管理系统 仍然保持交易的原子性质是至关重要的。

如果您还没有提交,那么当您的进程终止时,插入将不可见(并回滚)。

你什么时候执行这些提交?当你的插入代表某些一致和完整。例如,如果您必须为每封邮件插入2条信息,请在插入两条信息后进行提交。不要在每一个之后提交,因为你的信息不会一致或完整。

2

数据在数据库中不是永久的,没有提交。使用一个偶尔的提交来平衡在一个事务中执行多次插入的速度(提交越频繁,越慢)与提交更频繁的提交的安全性。

+0

什么是最好的办法呢?计数插入和一次在N做提交? – zaharpopov 2009-11-09 12:42:38

+0

它主要取决于您的应用程序。您可以每N次插入一次,或者每单位时间一次,或者您拥有其他任何刻度源。你必须权衡你的应用程序。 – 2009-11-09 13:00:54