使用SQLite构建实时无服务器多用户本地网络共享数据库的想法

时间:2013-08-28 08:54:37

标签: sqlite concurrency

我需要一些关于我的想法的意见。如果您对SQLite和最低预算的高端解决方案感兴趣/经验丰富(现在只赢);)这适合您。 在充实这个问题的同时,我对这个想法感到非常兴奋,所以请耐心等待。 有TL; DR低于

我用SQLite开发了一个VB.NET(3.5)桌面应用程序。数据是在EAV模型中构建的,因为我需要这种灵活性(数据的语义结构分别存储在XML文件中)。该应用程序实际上的表现远远超出我的预期,即使是 - 对于手头的场景 - 大型数据库(主文件大约120MB)。

当SQLite文件位于网络文件夹中时,预期性能非常糟糕。这是可以忍受的,但我有更高的目标。预期的情景(现在)是最大的。 10个需要在本地Windows网络中同时访问数据库的用户。重读取访问需要98%的并发,插入和更新很少且很小。

该软件几乎专门用于预算较低的环境,技术基础设施(支持和硬件)甚至更低,因此我的目标是避免使用数据库服务器。我也不想实现我自己的SQLite" Server" a la SQLitening(即告诉应用程序的一个实例自动"共享"网络中的数据库),因为我希望数据库能够驻留在独立的网络驱动器上。

我意识到这种情况后的第一次冲动无法通过优化查询进行修改,这是一种“懒惰的同步”#34;实施的方法几乎无痛。该数据库是" wiki-esque" (几乎)只插入,因此根本不会出现任何(很多)冲突问题:无论谁来,"最后"获胜,每个字段都有一个带有时间戳和用户ID的更改历史记录,可以单独回滚。条目被"标记为已删除"并且可以在"清理" -action时丢弃。 虽然它的代价是永远不会"生活"使用其他用户在会话期间更改或输入的数据,以及同步过程可能需要一段时间,用户可能会在" rush-hour"中相互阻塞。我们说的最糟糕的情况可能只有几分钟,这不是什么大问题,但也不会很酷。

TL; DR:如何使用SQLite为最终用户应用程序实现实时无服务器本地网络共享数据库,该应用程序已在具有<的方案中的本地数据文件上执行得非常好/ p>

  • 许多 SELECTs
  • 少数 INSERT
  • 没有 DELETE和
  • 每个用户会话几乎没有任何 UPDATE。

让我们进一步假设

  • 总是有足够的硬盘空间
  • 由于存档机制(以及数据隐私限制),数据库永远不会超过200MB
  • 我们可以有效地判断文件是否已被更改,以及&#34;共享目录中的对象是谁?#34;数据库文件所在的位置
  • 我们可以从共享目录中快速复制文件

现在我想到的是为每个会话实现差异文件,这些文件将在本地缓存以进行读取访问。

在客户会话开始时:

  • 检查共享目录中的大文件和特定于会话(见下文)的文件,以了解自上次会话以来的更改(共享目录中的CRC +日志文件)
  • 如果更改或未缓存,则在每次会话之前将大(200MB)当前数据库文件复制到本地路径
  • 如果更改或未缓存,也会复制所有特定于会话的文件(见下文)

  • 会话期间的所有INSERT都会写入共享目录中的一个特定于会话的小文件

    • 这可以限制为合适的大小,例如每个文件2MB或更小的东西,然后创建一个新文件
  • 然后,依次执行
  • 读取访问(SELECT)
    • 在主文件的本地副本中
    • 在会话文件的本地副本中
    • 在共享缓存中的所有当前(即新的)会话文件中
  • 在检测到新的会话文件时,会话文件将再次复制到本地缓存
  • 最后,会话文件定期合并到大文件中
    • 这可能是在每次会议结束时,但如果我没有记错的话,可能就是这样。

这会

  • 消除所有写并发性
  • 消除大文件和所有本地会话文件的读取并发性
  • 减少对小会话文件的读取所需的并发性
  • 最小化访问最新会话文件的网络使用率(每个并发用户2MB)
  • 保留每个客户端的当前数据状态的实时视图

这听起来对我来说太棒了。

问题: 是否有这个&#34;协议的名称&#34;我在概述所以我可以做进一步的研究?

你认为这是一个可行的方法与SQLite或这是一个疯狂的追逐 - 我是否忽略了明显的缺点?

如果您已经加入,会话文件的大小(n * page_size?)会是什么?

感谢您的投入!

了Christoph

1 个答案:

答案 0 :(得分:0)

对我来说,你正在尝试重新发明轮子!

您的应用程序开销,例如复制大型数据库文件,肯定会超越超级SQLite引擎。并且这种方法会产生很多隐私问题(可能不是在您的情况下,而是在隔离的服务器/客户端环境中)。

此外,您的“自定义RDBMS”肯定会违反ACID合规性。

最后,您的要求接缝非常适合Situations Where SQLite Works Well