内存数据库SQLite中的混合

时间:2013-01-28 21:12:57

标签: sql sqlite

我有一个使用对象集合的应用程序非常快。 现在,我正在添加一个用于持久化的数据库,所以我开始在SQLite数据库中保存。

但现在我发现的要慢得多。 我认为这是因为磁盘比ram慢。可以将DB放在内存中吗? 我在SQLite的文档中找到了Inmemory DB,但它在内存中,我需要坚持不懈。

那么,是否可以将内存中的数据库用于执行并在一段时间后保存到磁盘?

谢谢你和问候。

更新

在答案中他们说这是因为我做了很多插入,这是真的。他们说我应该批量插入。

我的代码在名为Computers:

的内存集合中看起来像这样
foreach (line in lines)
{
Computers.Add(new Computer { ComputerName = line});
}

现在在DB中:

    foreach (line in lines)
    {
string sql = "INSERT into computers VALUES ('"+computerName+"')";
SQLiteCommand command = new SQLiteCommand(sql, dbConnection);                            command.ExecuteNonQuery();
    }

如何在单个批量插入中执行此操作?

2 个答案:

答案 0 :(得分:2)

您可以使用Backup API来完成此任务。请参阅http://www.sqlite.org/backup.html提供了C中的完整代码示例。

如果您要同时执行大量插入操作,请确保将它们组合在一个事务中。否则SQLite会为每个插入等待一次磁盘旋转,这会大大减慢插入过程。这样做可能允许您使用基于磁盘的SQLite数据库,而不会减速。

另见
SQLite Insert very slow?

答案 1 :(得分:0)

如果内存中有数据库并且偶尔将其刷新到磁盘,则会丢失数据库中最重要的功能之一,即ACID。换句话说,你的应用程序可以编写认为它是持久的数据,然后一个后续问题可能会导致你丢失数据。

如果有足够的RAM可供数据库缓存经常访问的项目,许多数据库的性能都会很好(尽管仍然比RAM内解决方案慢得多)。

首先检查与数据库的交互中哪些确实很慢。您是否正在获取不会一遍又一遍变化的数据?也许缓存在数据库中?您是否对数据库进行了许多单独的更新,这些更新可以合并为一个更新?