2011-07-05 35 views
3

我有一个应用程序连接到数据库,并可以在多用户模式下使用,从而多台计算机可以连接相同的数据库服务器来查看和修改数据。其中一位客户总是被指定为“主”客户。该主站还接收来自RS232或UDP输入的文本信息,并将该数据每秒钟记录到本地机器上的文本文件中。德尔福 - 文件夹同步通过网络

我的问题是,其他客户端需要从主客户端访问这些数据。我只是想知道最好和最有效的方法来解决这个问题。我正在考虑两个方案:

  1. 写一个文件夹同步类远程(主)计算机上的文件夹与本地(客户端)计算机上的文件夹同步。这将是一个线程化的缓冲文件复制例程。
  2. 实施客户端/服务器,以便主计算机可以将此数据提供给连接和请求数据的任何客户端。主设备将通过TCP/UDP将文件发送到请求客户端。

该解决方案将不得不采取以下考虑:

一个。日志文件正在被写入每一秒。它必须避免任何潜在的文件锁定问题。

b。复制例程应该只复制在客户机上已经被修改的文件。

c。尽可能高效

d。所有机器都在局域网上

e。同步只需要执行,比如说每10分钟左右就执行一次。

f。数据量只有大约50MB的数量级,但是一旦初始(第一次)同步完成,那么传输的数据量将只有大约1MB。这将在未来增加

哪个更好的方法来使用?有什么优点/缺点?我也看到了我正在考虑使用的Fast File Copy文章。

回答

6

如果您使用数据库,为什么“主”将数据写入文本文件而不是数据库,如果这些数据需要共享?

+0

如果我将它存储在数据库中,这些文本文件中“有用”数据的数量与存储要求相比微不足道。我曾考虑过这个问题,但因为很多原因决定不保存所有内容 – Simon

+3

因此,为了节省数据库服务器上的廉价磁盘空间,您需要花费时间来实现基于复制文件的同步解决方案,而不是一次性复制相同的数据一个数据库,这将很好地解决并发访问? – 2011-07-05 17:54:10

+1

是的,我知道,但是还有其他原因会导致这种情况发生。我只需要大约0.001%的数据,并且数据库服务器上的备份时间至关重要。在这种特殊情况下,'便宜的磁盘空间'实际上并不便宜,因为现场缺乏便宜的互联网访问,数据库数据需要保持在最低限度 - 数据需要通过昂贵的卫星通信发送到极其偏远的位置。尽管谢谢,但这是一个很好的观点。 – Simon

2

编写一个Web服务接口,以便客户端连接到服务器并根据需要提取新数据。或者,您可以将其编写为订阅/推送机制,以便客户端连接到服务器,“订阅”,然后服务器将所有新内容推送到注册客户端。在注册时,客户端需要完全同步(获取自上次同步以来的所有更改),以防发生更新时脱机。

1

这两种解决方案都可以在局域网上正常工作,选择是你的。您可能还想考虑与您选择的技术相关的问题:

  • 部署灵活性。使用文件共享和文件复制需要文件共享才能工作,并且所有LAN用户都可以访问日志文件。
  • 更长期的计划:文件共享仅适用于本地网络,而基于IP的解决方案则适用于路由网络,包括Internet。
  • 与IP解决方案相比,基于文件的解决方案将更容易实施。
+0

+1感谢您的其他问题。由于这个软件只能用于局域网(因为它总是在没有互联网的远程位置),所以我不必担心这一点。我在考虑基于文件的方法会更容易 – Simon

3

为什么要发明轮子?改为使用rsync。 Windows套件:cwrsync

例如,在主机上安装rsync服务器,并在客户端计算机上安装rsync客户端或将文件简单地拖放到项目目录中。无论何时需要您的客户端机器上的应用程序将execute rsync.exe请求从服务器同步必要的文件。

为了复制打开的文件,您需要安装Windows卷影复制服务。 Here's关于如何设置主机以允许使用Windows卷影复制复制打开文件的非常详细的说明。

+0

rsync的+1。上次我需要这个,我花了很长时间在delphi上开发解决方案。然后,我放弃并安装了RSYNC并使用它,而不再回头。这是一个unix/linux实用程序,但它在Windows中很好用,并且已经安装了Windows安装程序/服务。 –

+0

在Delphi中RSync是否易于调用?没有使用过它... – Simon

+0

我使用rsync分配,无论是在Windows和Linux;这是一个Linux工具,尚未在Windows上找到好的家。 Windows端口(使用cygwin)有缺陷,有时由于未知原因无法工作。 99%的时间按预期工作,我使用它的原因是99%对我来说足够好,但如果要求100%的可靠性,那么这不是一种好的方法! –