3

问:我目前将 ASP.net 应用程序数据存储在 XML 文件中。

现在的问题是我有异步操作,这意味着我遇到了同时对 XML 文件进行写访问的问题......

现在,我正在考虑使用嵌入式数据库来解决这个问题。我目前正在考虑使用 SQlite 和可嵌入的 Firebird。

但是我不确定 SQlite 或 Firebird 是否可以处理多个并发写访问。
我当然不想再遇到同样的问题。
有人知道吗?
SQlite 当然更出名,但哪个更好 - SQlite 或 Firebird ?我倾向于说火鸟,但我真的不知道。

请不要 MS-Access 或 MS-SQL-express 推荐,我是一个理智的人。

4

5 回答 5

7

SQLITE 可以配置为在大多数情况下优雅地处理同时写入。发生的情况是,当一个线程或进程开始写入数据库时​​,文件被锁定。当第二次尝试写入并遇到锁时,它会在再次尝试写入之前回退一小段时间,直到它成功或超时。超时是可配置的,但除此之外,所有这一切都无需应用程序代码执行任何特殊操作,除非启用该选项,如下所示:

// set SQLite to wait and retry for up to 100ms if database locked
sqlite3_busy_timeout( db, 100 );

除了以下两种情况外,所有这些都非常有效且没有任何困难:

  1. 如果一个应用程序在一个事务中进行大量写入,比如一千次插入,那么数据库将被锁定很长一段时间,并可能导致任何其他尝试写入的应用程序出现问题。解决方案是将如此大的写入分解为单独的事务,以便其他应用程序可以访问数据库。

  2. 如果数据库由运行在不同机器上的不同进程共享,则共享一个网络安装磁盘。许多操作系统在网络安装的磁盘中存在错误,导致文件锁定不可靠。对此没有答案。如果你需要在网络挂载的磁盘上共享一个数据库,你需要另一个数据库引擎,比如 MySQL。

我对 Firebird 没有任何经验。多年来,我在许多应用程序中都使用过 SQLITE。

于 2010-05-19T17:42:59.183 回答
6

我会选择 Firebird 有很多原因,也是这个原因

虽然是事务性的,但 SQLite 不支持并发事务,所以如果你的嵌入式应用程序需要两个或多个连接,它们必须被序列化。嵌入式 Firebird 数据库很容易升级到完全共享的数据库 - 只需更改共享库。

也许你也可以检查这个

于 2010-05-19T17:18:16.780 回答
2

您是否使用 SQLite API 研究过 Berkeley DB 以获取 SQL 支持?

于 2010-11-03T13:00:47.497 回答
1

听起来 SQLite 很适合。我们在许多生产应用程序中使用 SQLite,它实际上支持在处理并发方面大有帮助的事务。

事务性sqlite?在 C# 中

于 2010-05-19T09:56:29.387 回答
0

我会在上面的 ravenspoint 列表中添加 #3:如果您有一个大型呼叫中心或订单处理中心,例如,可能有数十人同时点击“保存”按钮,即使每个人都在更新或插入只有一条记录,您可以使用繁忙的超时方法遇到问题。

对于场景 #3,可以序列化的真正 SQL 引擎是理想的;不太理想但可用的是可以对共享文件进行字节范围记录锁定的 dbms。但请注意,当新记录被附加到文件末尾时,即使是字节范围的记录锁定也不足以处理大量并发写入,就像货运列车末端的守车一样,因此多个进程正在尝试同时在相同的字节范围上设置锁定。另一方面,字节范围的记录锁定方案与散列密钥稀疏文件方法相结合(例如,用于 LAN 的旧 Revelation/OpenInsight 数据库)在这种情况下将远远优于 ISAM。

于 2010-11-03T13:25:08.087 回答