多用户嵌入式数据库

时间:2012-05-07 16:43:46

标签: c# database sqlite ravendb embedded-database

我的任务是找到一个适合数据库使用的即将推出的项目。我很难找到一个好的比赛。我们的应用程序是.Net Framework 4.0 C#应用程序。

首先我查看了SQLite,但我遇到了问题,因为SQLite在写入期间锁定了它的数据库文件。

我有两个独立的应用程序使用相同的数据库同时运行,我不能确定何时正在编写。我试图等待锁定释放,但这导致一些数据丢失。所以我认为我会发明一个队列系统,但是两个应用程序都需要使用相同的队列......所以我想我只会创建一个单独的Window服务。所有这些对我来说听起来像传统的RDBMS。

我决定回溯并问自己“我使用的是正确的数据库吗?”。

有人知道某个数据库可能符合我的要求吗?

以下是我的要求: 1.易于安装。这包括没有单独的“安装程序”,用户必须与我们的应用程序的安装分开运行。这首先使我相信我需要一个嵌入式数据库,但我认为可能有一些聪明的方法在我们的安装程序中包含数据库安装。

  1. 难以打破。这里最大的需求是它应该能够处理命名管道而不是TCP / IP以解决安全问题(或任何降低人们系统配置破坏我们应用程序的能力)。我们的应用程序将始终在同一台机器上运行。他们需要共享同一个数据库,因此如果涉及防火墙/安全/“智能用户”,使用TCP / IP可能会导致问题。

  2. 对数据库进行长时间运行不应阻止其他用户读取/写入数据库。我想写一些代码来处理这个要求,仍然使用Sqlite但决定做更多的功课。

  3. 许可:我们想要一些我们可以免费重新分配版税的东西。我们不希望我们的最终用户需要为我们依赖的数据库购买他们自己的单独许可证。

  4. 大小限制:我们计划在这些数据库中存储相当多的数据,并且不接受任意限制。我们愿意接受操作系统对文件大小施加的限制。 SQLite的大小限制(任何Windows机器文件的大小限制)大于2 TB。

  5. 很高兴:能够使用实体框架。

  6. 很高兴:关系型数据库。我们可能允许第三方应用程序读取我们的数据库,并且不介意它是关系而不是文档或对象数据库。但是,我们愿意为满足我们所有要求的东西而努力。

  7. 到目前为止我看过的数据库: RavenDB SQLite的 CubeSQLite SQL CE

    Oracle和Microsoft SQL Server已获得许可,难以重新分发。

    我知道这些要求非常严格。我甚至不确定是否有开箱即用的解决方案。我感谢任何人提供的任何帮助。

2 个答案:

答案 0 :(得分:3)

您需要使用SQL Server CE 4.0:

  • xcopy部署
  • 支持加密
  • 可自由分发
  • 支持多重主题(在您的情况下,多进程)仅从版本4.0
  • 支持4 Gb空间
  • 支持EF(甚至是CodeFirst)
  • 它是关系型的,并且支持SQL Server T-SQL的子集

你错误地认为它需要许可:

  

Microsoft SQL Server Compact 4.0是一个免费嵌入式数据库,软件开发人员可以使用它来构建ASP.NET网站和Windows桌面应用程序。 SQL Server Compact 4.0占用空间小,支持在应用程序文件夹中私有部署其二进制文件,在Visual Studio和WebMatrix中轻松进行应用程序开发,以及将模式和数据无缝迁移到SQL Server。

来自Microsoft SQL Server Compact 4.0 (MS download)

除非4Gb对您不够,否则您可以使用它。

SQL Server Express也是免费的,限制较少,但需要安装。

SQL CE和SQL Server之间的主要区别在于CE不支持Sotred Procedures。但是如果你使用的EF根本不是问题。

编辑有关许可的其他信息:

  

SQL Server Compact 4.0可根据再分发许可协议自由再分发,并且重新分发SQL Server Compact 4.0的应用程序开发人员可以选择在SQL Server Compact再分发站点注册。注册将帮助开发人员获取有关可以进一步应用于客户端安装的SQL Server Compact关键安全修补程序和修补程序的信息。

在下载页面的底部

答案 1 :(得分:0)

我意识到这是一个老问题,但我目前正在处理几乎相同的问题,并且想知道情况是否已经改变,所以这里就是这样!

从SQLite文档中可以看出,SQLite绝对可以实现这一点。

他们明确表示支持在同一台计算机上进行多进程访问。只有当您尝试通过网络共享SQLite有问题时。 http://www.sqlite.org/faq.html#q5

这部分特别感兴趣:“当任何进程想要写入时,它必须在更新期间锁定整个数据库文件。但这通常只需要几毫秒。其他进程只需等待编写器完成然后继续他们的业务。其他嵌入式SQL数据库引擎通常只允许一个进程一次连接到数据库。“

这不是解决问题的方法吗?似乎如果写入只需要几毫秒,你基本上可以循环调用直到它工作(具有适当的超时和延迟)。

我会选择CE,但我太喜欢开源了;)

相关问题