Delphi的数据库同步解决方案

4
我正在寻找一些起点,将Win32 Delphi应用程序的数据与Web应用程序的远程数据库集成。
此项目旨在解决以下问题:
1. 桌面在VPN上表现不佳。远程办公室的用户可以使用Web应用程序。
2. 一些公司更喜欢Web应用程序而非桌面应用程序。
3. 移动设备可以作为前端连接到Web应用程序。
我发现的问题是Web应用程序将在基于Unix的系统(可能是Linux)上运行,而桌面应用程序使用NexusDB,而Web应用程序可能会使用Postgres。这些平台和数据库不同。
在Delphi中,似乎无法为该项目使用Microsoft Sync Framework。
我的第一个想法是为Web应用程序提供标准的REST API,并使桌面应用程序每n分钟从本地数据库服务器作为客户端访问API。但这样会有很多问题!

你解决了这个问题吗?我目前正在努力解决从Linux连接到DBISAM数据库的问题。 - JorgeO
4个回答

6
Richard,我之前就走过这条路,我只能说不要这么做!我曾经为一家公司工作,他们有一个大型的Delphi桌面应用程序(超过250个窗体),运行在DBISAM上(与你所拥有的非常相似)。客户想要一个“Web”界面,以便人们可以远程工作,然后让Web应用程序和桌面应用程序同步更改。几年后,应用程序变得非常糟糕——数据问题和用户工作流程非常糟糕,因为在两个不同的地方管理相同的数据是一场噩梦。
我建议将数据库移动到像MySQL这样的东西上(Delphi和Web客户端都可以使用),并在两个接口之间使用一个数据库。Delphi客户端之所以在VPN上无法正常工作,是因为桌面数据库(如NexusDB和DBISAM)在运行查询时复制了太多的数据(返回所有数据,然后进行过滤/排序等操作),它不像SQL Server或MySQL那样真正的客户端/服务器,所有繁重的工作都在服务器上完成,只有结果返回。当然,将Delphi应用程序移动到像MySQL这样的DB中可能会完全消除速度问题,但您不能解决#2和#3。
另一个选择是将整个应用程序移动到Web上,并且只支持1个应用程序。当然,像Delphi这样的工具中的良好UI开发人员总是可以为Web应用程序提供更优秀的用户界面——特别是在数据输入密集型应用程序中——因此这可能不是您的选择。
我会非常谨慎地“同步数据”。
以上仅供参考。

1
我越想越觉得这是正确的。谢谢。 - Richard Holland
1
没错。所有的复制系统最终都会出现需要手动解决的冲突。真是太麻烦了。 - Warren P
1
我想说的是,对于Delphi桌面应用程序,您应该考虑使用3层开发。即使SQL服务器也会在窄带连接上推送大量信息,从而使桌面应用程序变慢。我过去成功地使用了DataSnap,并转向了RemObjects SDK + DataAbstract。后者具有数据压缩选项。(免责声明:只是一个满意的客户) - Stuart

5
如果您使用RESTful基于ORM,例如AJAX和客户端Delphi应用程序可以调用同一台Delphi服务器,使用JSON作为传输格式,HTTP / 1.1作为远程连接层,并使用Delphi和Javascript对象访问数据。

例如,如果您在浏览器中键入http://localhost:8080/root/SampleRecord,您将收到类似以下内容的信息:

[{"ID":1},{"ID":2},{"ID":3},{"ID":4}]

如果您请求http://localhost:8080/root/SampleRecord/1,你将会得到:

{"ID":1,"Time":"2010-02-08T11:07:09","Name":"AB","Question":"To be or not to be"}

如果你了解一些JavaScript,这可以被任何AJAX应用程序使用。

而且相同的HTTP/1.1 RESTful请求(GET/POST/PUT/DELETE/LOCK/UNLOCK...)已经在任何客户端HTTP/1.1应用程序中可用。该框架使用非常快的内核模式http.sys(比Windows上的任何其他HTTP服务器更快)实现服务器,并提供快速的客户端HTTP API。你甚至可以使用HTTPS来处理安全连接。

在我看来,使用这样的ORM比仅使用数据库连接更好,因为:

  • 它将更严格地遵循n-Tier原则:业务规则仅在Delphi服务器上编写一次,您只需使用业务对象的服务和RESTful操作;
  • 它将使用HTTP/1.1进行连接,这比任何直接的数据库连接更快,在Internet上更具标准化,并且可以通过HTTPS强烈保护;
  • JSON和RESTful over HTTP是AJAX应用程序的事实标准(即使Microsoft也将其用于WCF);
  • 数据将使用JSON传输,这是一个非常好的格式,适用于多个前端;
  • 无状态方法使其在未连接模式下非常强大;
  • 使用数据库的本地小副本(我们鼓励使用SQLite)允许您以未连接的方式访问客户端(适用于Delphi客户端或HTML 5客户端)。

我正在寻找一个Android应用程序的解决方案,该应用程序可能只有时不时地访问互联网,但当它访问互联网时,同步数据应该从我的(互联网)服务器流向应用程序以更新一些内容。我正在使用XE7,并且我已经查看了“FireDAC_SQLite.dproj”示例,该示例非常适用于固定的本地或远程数据库。我能否使用Synopse解决方案之一来解决我的问题?是否有我可以尝试的示例?谢谢。 - Brian Frost
1
@BrianFrost 当然可以。我们通过Delphi/FireMonkey或AJAX/SmartMobileStudio引入了跨平台客户端,包括Android客户端。提供了批处理模式,使您能够通过REST和JSON将修改后的数据推送到服务器。 - Arnaud Bouchez

2
我建议你只使用一个数据库,同时有两个前端(一个是通过调用SOAP方法进行后端工作的Web UI,另一个是基于Delphi的SOAP方法调用的丰富客户端,以及实现SOAP可访问方法的SOAP服务器层,其中包含你的业务逻辑)。
从你所描述的情况来看,你认为复制只会加速你的工作,但实际上它会减慢你的工作速度,并导致必须手动解决复制、一致性和关系完整性问题。

我也是这么想的。 - Richard Holland
但是直接数据库连接将会强制你用两种不同的语言为每个客户编写业务逻辑,这在长期来看也可能非常令人困惑。而且,直接数据库连接需要通过互联网进行调整的VPN等,没有可能的AJAX方法(没有AJAX应用程序将连接到数据库):因此,您将不得不使用PHP或IntraWeb编写Web前端...在我看来,这不是2011年更好的解决方案... - Arnaud Bouchez
我并没有说直接连接数据库。也许表述不够清晰,但是我所指的 SOAP 是指你编写服务器方法和服务器上的业务逻辑层。我已经编辑了我的回答以使其更加明确。 - Warren P
@Warren 好的,这样做确实有道理!但现在使用SOAP... - Arnaud Bouchez
SOAP对于需要使用Delphi + WebPHP的人仍然非常常见。您会建议什么? - Warren P
@Warren 一种使用JSON格式的RESTful方法。不使用PHP而是使用Ajax应用程序为网站提供服务。但当然,多年来SOAP是这种任务的常见解决方案。甚至Embarcadero开始使用JSON代替XML。 - Arnaud Bouchez

1

请看一下this

CopyCat是一个数据库复制引擎,作为Embarcadero Delphi的组件集编写。自2004年以来,CopyCat已经在生产中使用,并且非常稳定。许多小到大型企业每天都依赖它进行应用程序,包括站点间同步、差旅工作、数据库备份等等。我们有信心它也能满足您的需求。继续阅读...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接