3

我的任务是找到一个非常适合用于即将进行的项目的数据库。我很难找到一个好的匹配。我们的应用程序是一个 .Net Framework 4.0 C# 应用程序。

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

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

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

有人知道可能满足我给出的要求的数据库吗?

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

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

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

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

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

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

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

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

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

我了解这些要求非常严格。我什至不确定是否有现成的解决方案可用。我感谢任何人可以提供的任何帮助。

4

2 回答 2

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 下载)

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

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

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

编辑有关许可的附加信息:

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

在下载页面底部

于 2012-05-07T17:16:22.080 回答
0

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

从 SQLite 文档看来,使用 SQLite 绝对可以做到这一点。

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

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

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

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

于 2013-08-01T04:36:48.137 回答