问题:我目前将ASP.net应用程序数据存储在XML文件中.
现在的问题是我有异步操作,这意味着我遇到了对XML文件进行同时写访问的问题......
现在,我正在考虑转向嵌入式数据库来解决这个问题.我正在考虑使用SQlite和嵌入式Firebird.
但是我不确定SQlite或Firebird是否可以处理多个并发写访问.
我当然不希望再次遇到同样的问题.
有人知道吗?
SQlite当然更为人所知,但哪一个更好 - SQlite还是Firebird?我倾向于说Firebird,但我真的不知道.
请不要MS-Access或MS-SQL-express建议,我是一个理智的人.
可以将SQLITE配置为在大多数情况下正常处理同时写入.发生的情况是,当一个线程或进程开始写入db时,文件被锁定.当尝试第二次写入并遇到锁定时,它会在再次尝试写入之前暂停一段时间,直到成功或超时.超时是可配置的,但除非启用该选项,否则所有这些都会在没有应用程序代码执行任何特殊操作的情况下发生,如下所示:
// set SQLite to wait and retry for up to 100ms if database locked sqlite3_busy_timeout( db, 100 );
除了两种情况外,所有这些都非常有效且没有任何困难:
如果一个应用程序在一个事务中执行了大量的写入操作(例如一千个插入操作),那么数据库将被锁定很长一段时间并且可能导致任何其他尝试写入的应用程序出现问题.解决方案是将大量写入分解为单独的事务,以便其他应用程序可以访问数据库.
如果数据库由在不同计算机上运行的不同进程共享,则共享网络安装的磁盘.许多操作系统在网络安装的磁盘中存在错误,导致文件锁定不可靠.对此没有答案.如果需要在网络安装的磁盘上共享数据库,则需要另一个数据库引擎,如MySQL.
我对Firebird没有任何经验.多年来,我在许多应用程序中都使用过SQLITE这样的情况.
我会因为很多原因选择Firebird
虽然它是事务性的,但SQLite不支持并发事务,因此如果您的嵌入式应用程序需要两个或更多连接,则必须对它们进行序列化.嵌入式Firebird数据库很容易升级到完全共享的数据库 - 只需更改共享库即可.
也许你也可以查看这个