在开发.NET体系时,最常见的一个问题就是如何在分布式应用程序中本地保存数据。这类问题通常集中于用本地存储机制来使用数据集以及下载和同步机制的Web服务。我建议工程师避免考虑这些工具,除非访问的数据绝大部分是只读的。相反,我们应该首先考虑被实践证实为更可靠的拷贝和同步机制。让我们仔细看看几种可供选择的本地存储机制和同步功能。
本地数据存储的两种选择
对那些需要下载数据、需要对下载数据进行高速处理并可能返回结果的应用程序,使用数据集的方法是最理想的。数据集答应在有限的过滤和保存性能下进行对复杂数据结构进行高速的、内存中的(in-memory)访问,其性能与把数据以文件的形式保存到本地文件系统的性能一样好。然而,假如应用程序需要更强大的离线数据操作,那么你需要求助于更强有力的本地数据库机制。
微软公司提供了作为轻量级本地数据库引擎的两种不同版本的SQL 2000。在Windows CE设备的环境下,你可以使用SQL Server CE 2.0(SQLCE)。SQLCE是SQL Server 2000的重写版,它着重考虑到了Windows CE环境下的有限内存和处理器速度的限制。
膝上型、tablet或者远端桌上型电脑可以利用MSDE。MSDE实际上使用了真正的SQL Server 2000引擎代码,但是不答应同时有超过一定数量(目前为五个)的连接。此外,在MSDE中,SQL Server 2000所提供的绝大多数的拷贝函数和所有的Analysis Services功能就被移去,这样MSDE可以在桌上型电脑上更加有效的运行。微软公司开始在它的某些新产品上使用MSDE,这些新产品包括新的CRM应用程序,它用来作为CRM数据的离线存储器(offline store)。
上面所提到的两种本地数据存储器有两个共同的特点,这两个特点使得它们成为离线数据访问的理想选择。第一个特点是它们支持.NET框架。SQLServerCE名字空间包括所有的操作SQLCE所必须的类,而标准SQLClient名字空间答应一个Windows CE应用程序来治理远端的SQL Server数据库。Windows应用程序还可以用SQLClient来治理MSDE的本地拷贝或者远端的SQL Server数据库。第二个特点是这两种数据存储器可以作为远端SQL Server发行的订户(subscribers),这就答应它们参与拷贝合并(merge-replication)。
远端数据存储
SQL Server 2000与它对应的本地版本协作来提供强壮的拷贝和同步机制。SQL Server 2000支持由一个本地引擎处理的两种不同的治理数据的机制。
--------------------------------------------------------------------------------
不是SQL Server?
假如你正在使用其它数据库,或者你处理其它系统的数据,那么一个选择就是把你的数据移到一个中间SQL Server,然后使用标准的同步机制来从中配置数据。假如你的数据库提供商没有本地数据库引擎的话,这样做的好处就是避免你自己编写同步机制了。
--------------------------------------------------------------------------------
第一个机制是SQL Server的拷贝合并(Merge Replication)功能。使用拷贝合并功能后,无论是客户端还是服务器段都可以跟踪数据的改变,在同步期间,只有改变的数据才需要在客户端和服务器端之间传递。由于服务器端跟踪了所有的改变,它可以要求更多的服务器硬件和连接来有效工作。拷贝合并的功能只有SQL Server 2000才提供。
SQL Server的拷贝合并引擎在治理离线数据时是非常有效的。它答应垂直和水平数据分割以及动态水平过滤以减少前后传输的数据集的大小。它可以自动创建自定范围的标示栏(auto-ranged identity column)这样多个订户(subscribers)就可以在创建同步期间自动分析的独有的标示栏。而且它使用了标准或者自定义冲突解决规则,这就降低了开发者使用它的难度,确保了数据在同步期间的完整性。
第二个机制是远端数据访问(Remote Data Access,RDA)机制。在所有的数据变化均有客户端产生的情况下,使用RDA机制是最理想的。假如数据在服务器端发生改变,RDA没有自动同步机制,客户端需要自己检查出这些变化。RDA可以与SQL Server 2000或者SQL Server 7.0协同工作。在使用RDA的场合下,你的本地应用程序需要与服务器相连,下载表格到本地设备上作为SQL Server的拷贝,然后断开连接。离线后,本地SQL Server存储器(如SQLCE或者MSDE)有跟踪数据变化的能力。当本地应用程序重新去服务器相连时,这些变化就返回给服务器。RDA很轻易建立,其性能也不错,这是因为服务器无需要求跟踪数据的变化。
决定使用哪种拷贝机制
选择使用拷贝合并机制还是RDA机制并不互相矛盾。例如,在离线定购的系统中,你可以选择用拷贝合并机制来更新对话框,但是本地传输处理却又使用RDA。无论哪种情况,你都需要确保对授权限制的理解。你还必须确保每个分享拷贝的客户都有客户访问授权(Client Access License),你也可以购买CPU授权(它当作拷贝中心)。尽管即使是最具竞争性的本地引擎技术也要收取per-device费用,好在只要你获得了SQL Server桌面电脑版的授权,那么无论你配置了多少个客户,都无需再为本地SQL引擎缴纳授权费用了。你可以把节省下来的钱用于为客户提供更好的解决方案上。