2

问题

我在同一 LAN 中的不同 PC(操作系统:Windows XP、Windows 7)上运行相同 C# 应用程序的多个实例。我必须在它们之间共享一些配置数据。每个进程都必须对数据具有读写访问权限。我的雇主坚持将这些共享数据存储在一个文件中,该文件位于其中一台 PC 的共享目录中。

可能的解决方案:

  1. 独占文件打开:数据存储在 TXT 文件中(序列化到二进制文件和从二进制文件序列化也是一种选择)。尝试打开文件时,每个进程都使用File.Openwith 。FileShare.None获得一个IOException意味着该文件已经在使用中,因此该过程必须等待并稍后重试
  2. SQL Server CE 嵌入式数据库:数据存储在 SDF 文件中。该引擎最多可以处理 256 个同时连接(v3.5 SP2),这绰绰有余。
  3. SQLite 嵌入式数据库:数据存储在 SQLite 数据库文件中。文档说 SQLite 可以工作,但在网络共享上使用时可能不可靠。
  4. 其他?

这样做的首选方法是什么?

4

3 回答 3

1

您并没有真正描述您正在使用的数据类型,所以我会说答案各不相同。

如果您正在使用的数据通常可以被认为是面向记录/字段的(并且在极少数情况下即使不是),那么最好使用适当的 DBMS。在这种情况下,我会推荐 MSSQL CE,因为它的运行时将为您缓解多用户问题。

SQLite 通常被认为是单个用户/应用程序数据库(至少在我在 C 中使用它时),尽管在过去 5 年中情况可能发生了变化。如果您使用的是 .NET 4,那么我发现的可用免费适配器很少,除非您对混合框架应用程序感到满意。

如果您处于数据在设计上非常平坦(如日志文件)的情况下,我只会手动监控文件锁定,但如果它是像数据一样的日志,我可能会研究一些开源日志库做。您基本上说您可以控制数据结构,因此我建议重新设计数据以使其更加规范化/刚性,以避免使用此解决方案。

于 2012-01-22T00:51:24.177 回答
1

不知道是否是最好的方法,但我很久以前在 C 中做过这个,它对我来说效果很好。

每个进程都将读取并创建文件的个人副本,然后进行处理。

在固定的时刻(在进程终止或通过某些 UI 或任何您喜欢的方式触发时)每个进程会将其文件副本发送到主进程,该主进程负责在共享目录中重建原始文件并向其他进程发出信号需要重新加载。

每个进程重新加载文件(包含来自所有其他进程的信息)。

当然这个解决方案要求文件写入过程有关于如何重建文件以及如何解决冲突的知识(但这取决于数据格式)

于 2012-01-22T00:52:15.023 回答
1

创建一个 Web 服务并让您的程序从那里提取配置。您可以从 Web 服务内部控制文件锁定,而不必在程序级别进行处理。这也为您提供了一种抽象,即如果您决定更改设置的存储方式(例如,将它们从文件移动到数据库),则无需对程序进行任何更改即可执行此操作。

于 2012-01-22T01:11:16.430 回答