.NET 和Java 对象 XML序列化 库WOX通过企业分布式缓存共享运行时数。

当 .NET 应用程序将目标转换为 XML 文档并蕴藏该 XML。实际上,XML
被当作可移栽数据存储机制,因为 .NET 对象吃转移为 XML,然后以自 XML
转换为 Java,反之亦然。

众商行还结使用 Microsoft .NET Framework 和 Java
应用程序,尤其是那些由于各种考虑不克独靠让单一技术的大中型企业。
通常,企业用 Web 应用程序、面向服务的网布局 (SOA) Web
服务和其它服务器应用程序来拍卖大量事务。

Carlos Jaimez 和 Simon Lucas 开发的 Web Objects in
XML(WOX,woxserializer.sourceforge.net)就是一个完结这个桩任务之开源项目。

里面森应用程序在运转时得彼此共享数据。
通常,这些应用程序全都是对数据库中所蕴藏的常用业务数据进行操作。
它们对的一般是连数据流(如金融交易应用程序),而且需要以运行时一再处理数量并同其余应用程序共享结果。

下面是选取自那网站的 Java 到 .NET 转换示例。下面是采取 Java 和 C# 定义的
Student 和 Course 类。

虽数据库是永恒存储数据的要紧存储区,但连无极端适合运行时数共享。
其中一个缘由在,从数据库读取数据时无克尽保高性能。
再者,在处理事务方面数据库的扩展性并无好,因此非常可能大快会成为瓶颈,并退因让它们的装有应用程序的快慢。

图 3 用 Java 和 C# 编写的 Student 和 Course 类

另外,也无力回天实时、有效地共享数据。
实时数共享要求而某个应用程序更新了数,则指向拖欠数据感兴趣的任何兼具应用程序都应该就接通知。
同样,某些应用程序可能刚刚拭目以待某些数据类型被创造并可用,一旦这些操作发生,这些应用程序应当马上接受通知。

          // Java classespublic class Student{  private String name;  private int registrationNumber;  private Course[] courses;}public class Course{  private int code;  private String name;  private int term;} // ***************************************************// .NET classes in C#public class Student{  private String name;  private Int32 registrationNumber;  private Course[] courses;}public class Course{  private Int32 code;  private String name;  private Int32 term;}        

不论是需要共享数据的那些应用程序是都基于 .NET
Framework,还是有一对基于 .NET 而其他一样有的因 Java,这还是常见问题。
事实上,如果应用程序混合使用 .NET 和
Java,问题会见再要紧,因为对此此类应用程序而言,在应用程序层面达到向来无因本机形式共享数据的机动智。

万一我们应用 .NET 和 Java 应用程序将以上 Student 和 Course 对象下 WOX
库将这些目标转换为 XML。
之后,如果应用程序想如果自XML读博这些目标,则还读取 WOX 库,将 XML
转换回 Java 或 .NET 对象格式。下面是变为 XML 格式的 Student 和 Course
类。

解决方案:企业分布式缓存

有幸的凡,企业分布式缓存可以化解这些题目。
这种内存中储存可超过多只服务器,将服务器的内存集中在并,因而内存存储容量是不过扩大的。
事务容量也移得而扩大,添加的服务器越多,能够处理的事情负载越怪。

商厦分布式缓存还提供了风波通报机制,应用程序在创新数据后得以相互通报。
由此,您得有所异步事件通报机制,其中一个应用程序生成数据,其他应用程序可以使用该数额,从而开创了劳动者/使用者模型或发表/订阅模型。
多个应用程序可订阅某些数据类型,当该多少发布时这些应用程序将接通知。

还有一样种通读/通写机制,即公司分布式缓存本身可以于数据源和应用程序读取大量数。
无论应用程序是根据 Java 还是
.NET,其代码都可转移得重复简约,因为可以由店分布式缓存中读取数据,
而任由需坐数据库访问代码。 图 1 是一个采用企业分布式缓存的 .NET
Framework 应用程序的简要示例。

图 1 动用企业分布式缓存的 .NET 应用程序

          using System;...          using Alachisoft.NCache.Web.Caching; namespace Client{  class Program  {    static string _sCacheName = "myAppCache";    static Cache _sCache = NCache.InitializeCache(_sCacheName);     static void Main(string[] args)    {      string employeeId = "1000";      string key = "Employee:EmployeeId:" + employeeId;                  // First check the cache for this employee      Employee emp = _sCache.Get(key);       // If cache doesn't have it then make database call      if (emp == null)      {        emp = LoadEmployeeFromDb(employeeId);         // Now add it to the cache for next time        _sCache.Insert(key, emp);      }    }  }}        

除此之外,企业分布式缓存可以依据其它第三在应用程序对数据库所召开的别样数据变动进行共同。
它同数据库中有连接,因此一旦数据库被之一数据类型发生变化,便会收取通知。
图 2 给闹了 .NET 和 Java
应用程序如何当运行时经公司分布式缓存相互共享数据的图解说明。

图片 1.png)

图 2 .NET 和 Java 应用程序通过分布式缓存共享数据

转换为 XML 的 Java 和 .NET 类

.NET 和 Java 应用程序共享数据

依靠企业分布式缓存,多单应用程序(不论是冲 .NET 还是
Java)可以看和一个缓存并透过缓存共享数据。 如果仅是 .NET
应用程序(或只是是 Java
应用程序)通过分布式缓存共享数据,则应用程序可以将目标存储吗本机二上前制格式并对该展开序列化/反序列化。
但如果是个别种植档次的应用程序之间交互共享数据,则要拿数据以可移栽数据格式存储在分布式缓存中。

立刻是为当 .NET 应用程序在分布式缓存中贮存对象时,实际上会将目标转换为
XML 文档并储存该 XML。 另一方面,当 Java
应用程序从分布式缓存读取该多少常常,会将 XML 转换为 Java 对象。
实际上,XML 被看成可移栽数据存储机制,因为 .NET 对象为转换为
XML,然后还要打 XML 转换为 Java,反之亦然。

出很多开源代码库可以辅助你将 .NET 或 Java 对象转换为
XML,然后换回对象格式。
当然,您为足以友善开支,不过自己建议乃选择开放源代码库。 我个人于好
Carlos Jaimez 和 Simon Lucas 开发的 Web Objects in
XML(WOX,woxserializer.sourceforge.net)。
本文中将用选择自那网站的 Java 到 .NET 转换示例(已征得他们同意)。
3
显示了采取 Java 和 C# 定义的 Student 和 Course 类。

图 3 用 Java 和 C# 编写的 Student 和 Course 类

          // Java classespublic class Student{  private String name;  private int registrationNumber;  private Course[] courses;}public class Course{  private int code;  private String name;  private int term;} // ***************************************************// .NET classes in C#public class Student{  private String name;  private Int32 registrationNumber;  private Course[] courses;}public class Course{  private Int32 code;  private String name;  private Int32 term;}        

假如我们使用 .NET 和 Java 应用程序将以上 Student 和 Course
对象存储在小卖部分布式缓存中,那么随着可应用 WOX 库将这些目标转换为
XML。 之后,如果应用程序想使自店分布式缓存中读取这些目标,则重复读取
WOX 库,将 XML 转换回 Java 或 .NET 对象格式。 图 4 显示了转移为 XML
格式的 Student 和 Course 类。

图 4 转换为 XML 的 Java 和 .NET 类

          <object type="Student" id="0">  <field name="name" type="string" value="Carlos Jaimez"/>  <field name="registrationNumber" type="int" value="76453"/>  <field name="courses">    <object type="array" elementType="Course" length="3" id="1">      <object type="Course" id="2">        <field name="code" type="int" value="6756"/>        <field name="name" type="string"           value="XML and Related Technologies"/>        <field name="term" type="int" value="2"/>      </object>      <object type="Course" id="3">        <field name="code" type="int" value="9865"/>        <field name="name" type="string"           value="Object Oriented Programming"/>        <field name="term" type="int" value="2"/>      </object>      <object type="Course" id="4">        <field name="code" type="int" value="1134"/>        <field name="name" type="string" value="E-Commerce Programming"/>        <field name="term" type="int" value="3"/>      </object>    </object>  </field></object>        

于您的应用程序中,应当从缓存层或数访问层调用 WOX。

 <object type="Student" id="0">  <field name="name" type="string" value="Carlos Jaimez"/>  <field name="registrationNumber" type="int" value="76453"/>  <field name="courses">    <object type="array" elementType="Course" length="3" id="1">      <object type="Course" id="2">        <field name="code" type="int" value="6756"/>        <field name="name" type="string"           value="XML and Related Technologies"/>        <field name="term" type="int" value="2"/>      </object>      <object type="Course" id="3">        <field name="code" type="int" value="9865"/>        <field name="name" type="string"           value="Object Oriented Programming"/>        <field name="term" type="int" value="2"/>      </object>      <object type="Course" id="4">        <field name="code" type="int" value="1134"/>        <field name="name" type="string" value="E-Commerce Programming"/>        <field name="term" type="int" value="3"/>      </object>    </object>  </field></object>        

基于项之轩然大波通报

事件通报机制功能强大,多个应用程序(.NET 和
Java)可经该机制协调异步数据共享。
在拖欠机制的援助下,应用程序可免执行代价高昂的数据库轮询。 该机制只是于
.NET 和 Java 应用程序间共享,因此能无缝地相互关照。

事件通报的一个常常因此路即基于项的通报。
在此类型中,应用程序登记感兴趣的依次缓存项密钥(可能早就是,也或没在叫缓存中),只要任何人以任何原因在分布式缓存中长、更新或去了该项,应用程序都用分别接受通知。
例如,即使某项由于到或被逐出而备受删除,也将触发项删除事件通报。

.NET 和 Java
应用程序都可登记对同缓存项的志趣,并吸收有关该项的通报。
通知中屡见不鲜还包于影响之苏存项,如齐片吃所陈述,这些项用根据应用程序的类型转换为
.NET 或 Java 格式。

当公的应用程序中调用 WOX将XML转换为.NET或是Java对象。

应用程序生成的自定义事件通报

于 .NET 和 Java 应用程序,企业分布式缓存同时为是强硬的轩然大波传播平台。
与店家分布式缓存相连的另外应用程序都好在缓存中触发自定义事件,而后,不论应用程序位于何处,只要报了对这些由定义事件感兴趣,那么还见面吸收缓存的通。
这本身即于柜分布式缓存中提供了一个强大的单身为言语和平台的轩然大波传播机制。

应用程序可乘该功能协调异步数据共享。
例如,如果有应用程序将数据放入分布式缓存中,然后触发一个自定义事件,计划下采取要处理该数量的别应用程序将即时接受通知。

基于连续查询的风波通报

因项的风波通报虽然功能强大,但是要求应用程序知晓缓存项的密钥。
如果用依据项的轩然大波通报和信用社分布式缓存中时常提供的另外分组功能(如标记、组/子组等)结合使用,那么几可以处理需依据各个缓存项所发的事态通报应用程序的富有情况。

只是,基于项的波在个别个限。
首先,前面提到过,应用程序必须掌握想如果接到通知之保有缓存项的密钥。
其次,不论这些项有何变化,应用程序都将接通知。
应用程序无法设定更详尽的正规化,以便就在数产生一定变化时才收通知。

为诺本着此类情况,企业分布式缓存提供了连续查询,这是同等种植类似 SQL
的询问,可捕获应用程序所感兴趣数据的系事情规则。
连续查询并非搜寻查询,而是店铺分布式缓存保持的某种“标准”。只要分布式缓存中长或更新了内容,便会用拖欠操作及连续查询专业进行较。
如果标准相当,则触发事件,并通知发布连接查询专业的应用程序。

透过连接查询,应用程序可以等待还复杂的变更,并只当有这些改变时才收到通知。

接读与通写处理程序

成千上万早晚,应用程序尝试读取的多少并无以店分布式缓存中,必须于数据库被读取。
此时,应用程序可以直接看数据库并宣读博该数据,但眼看意味着有应用程序都须复制相同之数码看代码(尤其是于
.NET 和 Java 中)。
或者,也足以于待多少常常,要求店家分布式缓存为那由数据库被读取该数据。

发了通读/通写功能,企业分布式缓存可自数据源直接读取数据。
应用程序可简化其代码,从而无需访问数据库。
它们只待要求公司分布式缓存为其提供数据,如果缓存中管拖欠数量,则做客数据源并宣读博该数据。
图 5 显示了店铺分布式缓存是哪以通读和通写功能的。

图片 2.png)

图 5 通读/通写的施用原理

来某些需专注。
虽然给分布式缓存从数据库读取数据有好死之利益,但本有广大数据类型最好是因为应用程序直接由数据库读取。
如果只要读取的凡含复杂连接的数据集,那么最好是因为应用程序亲自读取,然后以那放入分布式缓存中。

数据库同步

由大气数量给放入了商店分布式缓存中,因此须管这些数量和主数据源(通常也关系数据库)保持并才生义。
企业分布式缓存提供了之意义。

透过数据库同步功能,应用程序可以指定缓存项和数据库表中行之间的涉(依赖关系)。
只要数据库中的数额产生转移,数据库服务器即会触发 .NET 事件(即使是 SQL
Server 2005/2008 数据库),并以这更改通知企业分布式缓存。 对于无支持
.NET
事件的别样数据库,企业分布式缓存也提供了而部署的轮询,以便分布式缓存可以轮询数据库(比如各级隔
15 秒钟一破),并以数据变动时开展协同。

继而分布式缓存将从今缓存中剔除该数量,或读博该多少的全新副本(如果安排了通读功能)。
图 6 显示了号分布式缓存与 SQL Server 是如何共同的。

图片 3.png)

图 6 分布式缓存中的数据库同步

高可用性:自修复动态群集

庄分布式缓存可用作多单应用程序之间的运行时数据库共享平台(.NET 到
.NET、.NET 到 Java 和 Java 到 Java)。
很多景下,这些应用程序对于你的店堂而言要。

出于广大着重任务应用程序都负让企业分布式缓存,因此分布式缓存必须怀有高可用性。
企业分布式缓存不能够瘫痪或终止工作,并且该完全不需要停机以拓展保护或另常规操作。

局分布式缓存通过可起修复的动态缓存服务器群集来兑现高可用性。
此处的自修复表示群集清楚该具备成员,当起成员离开或加盟时见面动态调整。
此外,还足以确保数据是重复的以管可靠性,并且使起群集成员离开,其备份数据可机关供应用程序使用。
所有这些意义要迅速实施,且无会见对下企业分布式缓存的应用程序造成其他中断。

然而扩展性:缓存分区和复制

动企业分布式缓存的洋洋应用程序都是大工作应用程序。
因此,缓存群集上之负载会迅速增强。不过,如果商家分布式缓存的响应时间延长,其价值会大打折扣。
事实上,在大势所趋范围外,企业分布式缓存要优于关系数据库。由于其可以以动态群集中长更多之服务器,因而每秒处理的事情要比较数据库多得差不多。
但除非分布式缓存中之多少为智能方式囤,否则无法兑现而扩展性。
这同沾可经数量分区来实现,每个分区进行复制以管可靠性。

幸好了号分布式缓存,您可动用分区拓扑来拓展扩张。 图 7
显示了分区复制拓扑。

图片 4.png)

图 7 用于可靠扩展的分区复制拓扑

商店分布式缓存会对缓存中贮存的兼具数据自动进行分区。
每个分区存储于不同服务器上,同时在另外一样玉服务器上创设同仓储该分区的备份。
这管了便其他服务器停机,数据吧不会见丢。

总的说来,您得运用分区技术以动态群集中长更多的缓存服务器因为扩大存储容量,随着服务器的增,每秒处理的事务量也将增强。
并且,复制确保了数量的可靠性,因为服务器停机不见面招致数据丢失。

作用及搭档

总而言之,企业分布式缓存是赛工作 .NET 和 Java
应用程序相互共享数据的帅途径。
其精的风波传播机制,包括因项之事件通报、应用程序生成的自定义事件通报及因连续查询的风波通报,确保了实时共享数据。

就设计而言,企业分布式缓存不仅速度迅猛,而且是不过扩大的。
高快来源于自在内存中进行操作。 可扩大性源自能添加多尊服务器。
它对实在存储进行分区,并拿每个分区存储在不同服务器上,同时以另外一样光服务器(如
RAID 磁盘)上囤积该分区的备份。

今之应用程序与过去比有所更胜之成效要求。
它们要坐还具备协作性的章程来共享数据与相相互。
它们不仅要速度飞快,同时还要满足无限高负荷需求,以避免伤害性和可扩展性。
而且,它们要超过多只平台实施操作,使 .NET 应用程序可以透明而中地以及
Java 应用程序合作。 企业分布式缓存可帮忙我们上上述有目标。

Iqbal Khan 是 Alachisoft
(alachisoft.com)
的总裁及技术推广者,该店铺供的 Ncache(.NET
分布式缓存)可增长公司应用程序的性能与而扩展性。Khan 于 1990
年获得印第安那大学的处理器对硕士学位。您得经过电子邮件及他沟通:iqbal@alachisoft.com

原稿链接:http://msdn.microsoft.com/zh-cn/magazine/gg232763.aspx

相关文章