帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:Bamboo  bam  REL  MOV  Relational  数据  关系数据库  PRE  


介绍

使用数据密集应用程序的irritations之一是,你几乎必须使用关系数据库来存储数据。 因为它们存储和检索数据非常高效,所以对它们的选择很少。 缺点是开发人员需要处理大量编程开销,以跨越对象之间的阻抗不匹配和数据。 and从来没有成为一个非常成功的替代品,而且它们的价格和重量一样。

如果有一个快速的轻量级数据存储,那不是很好? 保存内存( 毕竟记忆是廉价的) 所需的所有对象并将它们存储在一起并为你提供相同的酸属性的所有对象。

嗯,这就是,这叫做普通,.NET 实现叫做竹子。 本文演示了如何使用XSD迁移工具包将你的RDBMS移到bamboo实现。

背景- 什么是流行

prevalence的概念是由克劳斯Wuestefeld发明的。 他的概念很简单

  • 所有对象都存储在内存中,因为内存很便宜。
  • 按照规则间隔,( 或者关闭时) 将对象序列化为磁盘,称为快照。
  • 对对象的所有操作都记录在commandlog中,该立即写入磁盘。

这三个概念是非常简单而强大的。 内存便宜,1千兆字节内存不常见,这些天也不太贵。 许多( 。不是全部,但可能是 80%或者更多) 数据库不使用这么多数据。

将快照写入磁盘很快,而且不会导致 O/S 已经执行的所有磁盘 I/O 之间的开销。

立即将commandlog写入磁盘将使我们能够恢复。 如果应用程序超过了它,就会重新启动快照,然后读取快照和应用的commandlog 。

Wiki Prevalence http://www.prevayler.org/wiki.jsp的流行Wiki运行了comparisons和 Oracle,并在performance和的性能上得到了respectively的对比。 但在大多数情况下。 真正重要的是,人们可以使用适当的实体对象而不是表/记录和飞轮模式。 这使得从开发的角度来说,实现是轻量级的。

流行的C# 实现称为竹子,可以在Sourceforge的http://sourceforge.net/projects/bbooprevalence/ 找到。

XSD迁移工具包( 又名 Bamboo Builder )

Bamboo的一个问题是,它采用了greenfields视图: 只需写几个对象,然后离开。 实际上,我的所有应用程序都在数据库上,我对移动它们非常感兴趣。 所以我开发了XSD迁移工具包。 它的用途很简单:

  • 读取 VS.NET. 中生成的DataSet的XSD文件
  • 对于每个表编写一个业务类。
  • 编写一个 RootObject 来管理对所有实体的访问。

你可能会问,为什么要麻烦,因为 XSD.EXE 已经有了一个从XSD文件生成类的选项。 我就是这么开始的。 但后来我发现还有这么多要做的事情。 这些类只是 public 实例变量的集合。 我认为最好的做法是。 我希望具备以下功能:

  • 所有表字段都封装为属性。
  • 对于分布式应用程序,我需要一个概念来检测更新冲突。
  • 我需要一种管理外键的方法。
  • 主键应为 protected,以防发生意外更改。

然后需要收集实例,以便你可以找到它们。 这里是 root 对象所在的地方。 简而言之,它具有以下职责:

  • 它包含了所有业务实体( aka记录)的实例,这些实体是。
  • 它可以被调用插入。检索。更新或者 delete 实体。
  • 它具有检索具有特定外键的实体的功能。
  • 支持具有多个字段主键的实体。
  • 用作调用的单个入口点,以便更改数据,以便静态地包围它并进行它的魔术。

那些是最小的特征。 另外,我还想要更多的( 谁不't 。 这就是我在结尾的结果:

  • 每个实体( 我想当我生成entitites时,我应该去 hog 。)的Stronlgy类型集合和字典。
  • IEditableObject的支持,因为我也希望在表单中使用它们。
  • 远程处理( 实际上,竹子的特定实现已经经完成了,所以我不能在这里声明它。) 。
  • 对象对象关系;远离外键

最后一个项目看起来很自然被包含在第一个 List 中。 所以它是- 直到我实现一个远程应用。 忽略通过值检索的问题与其他实例具有关系的对象。 我可以跟你一起。 但如果你确实更新了这里对象并更改了与另一个对象的关系,则在服务器上调用Update方法。 服务器接收更新的对象( 物理上跟商店里的不同) 加上所有相关的对象,这些对象与存储中的内容不同。 服务器现在必须进行,通过检查存储的所有关系并与更新调用中接收的对比来更新存储对象。 真是噩梦啊。

所以我决定用外键。 我把它叫做 coupled耦合关系 。 这会让生活更轻松。

所以我没有实现最后一个项目。 但是我正在考虑生成autoretriving属性,这些属性只会回接到服务器。

在我忘记之前还有一个特性: 生成自动加载程序类,可以以从数据库填充原始的DataSet,并创建对象并存储在竹商店。

使用示例

本文有几个组件:

  • BambooBuilder.exe: 生成类文件的应用程序。
  • 一个名为 SimpleIssueTrack.xsd的简单XSD文件。
  • 生成的类文件。
  • 加载和访问对象的简单应用程序骨架。

对生成的类的简要浏览

XSD定义了几个表

  • 颁发
  • IssueArea
  • 人员
  • ActionItem
  • 代码集
  • CodeSetValue

BambooBuilder读取这里文件并为每个表生成一个类文件。 它还生成一个名为 IssueTrackRoot的root 类和一个名为 IssueTrackLoader的加载器类。

让我们看一下生成的Issue.cs:

//// Generated by EntityClassGenerator // Generated on 31/10/2003 10:04:49 namespace IssueTrackerLib
{
 using System; 
 using System.Collections; 
 using Bamboo.Prevalence; 
 [Serializable()] 
 publicclass Issue : System.ComponentModel.IEditableObject {

兴趣点 是所有类都必须具有 SerializableAttribute 属性。 IEditableObject 接口规范是完全可选的,它的生成可以在Bamboo中关闭。

在开头是作为 private 变量列出的所有字段:

internalint _updateCount = 0;internalint _IssueID;privateint _AssignedToPersonId;private System.Decimal _Cost;private System.DateTime _DateCreated;privatestring _Description;

第一个变量实际上不表示字段。 它的目的是帮助开放式并发控制- 更多关于。 下一个是在前面有底线的字段名。 如何标记 private 变量是一个taste的问题。

作为一个有趣的点,第一个变量 _IssueID 被标记为内部。 它是一个主键,因此它不应该被应用程序更改。 但是它需要用适当的主键来设置( 由 root 类) 。 因为它是一个 int,Bamboo生成了代码使它成为自动编号键。

这是 root 类的Insert方法的外观:

///<SUMMARY>/// Method used to Insert a Issue object ///</SUMMARY>publicvirtual Issue Insert(Issue newIssue)
{
 if ((newIssue == null)) 
 { 
 thrownew System.ArgumentNullException("newIssue",
 "Can't Insert a null object"); 
 } 
 newIssue._IssueID = _nextIssueID; 
 _nextIssueID = (_nextIssueID + 1); 
 _Issues.Add(newIssue.KeyObject, newIssue); 
 return newIssue; 
}

Insert() 方法只跟踪所有的nextids 。 对于每个实体,root 对象有一个 Insert() 方法。 这使得它变得简单,因为没有 InsertIssueInsertPerson 或者 InsertActionItem

主键出现时,主键是另一个问题。 CodeSetValue 有两个键:

  • CodeSetId,它也是代码集的外键。
  • Value 是一个字符串。

为了处理这个问题,所有实体都有一个名为 KeyObject的方法,它返回一个 Object 。 在 Issue 类的情况下,它是 IssueID 。 在 CodeSetValue的情况下,生成 KeyObject

publicvirtualobject KeyObject 
{ 
 get { returnnew _KeyObject(CodeSetId, Value); }
}

_KeyObjectCodeSetId 内部的。 它实现了一个覆盖比较方法 Equals()的对象,以允许在实例之间确定/等同性。 下面是类 IssueArea._KeyObject的实现。

[Serializable]publicclass _KeyObject {
 privateint _CodeSetId;
 privatestring _Value;
 public _KeyObject(int CodeSetId, string Value) {
 _CodeSetId = CodeSetId;
 _Value = Value;
 }
 publicoverridebool Equals(Object obj) {
 if (this.GetType()!= obj.GetType()) returnfalse;
 _KeyObject kObj = (_KeyObject) obj;
 return ((_CodeSetId == kObj._CodeSetId) 
 && (_Value == kObj._Value));
 }
 publicoverrideint GetHashCode() {
 return _CodeSetId.GetHashCode() ^ _Value.GetHashCode();
 }
}

因为 _KeyObject 重写 Equals(),它还必须重写 GetHashCode()

如何使用类

编写应用程序需要创建一些代码,但是比以前少很多。

启动- 创建流行引擎

当initialising需要创建流行引擎的实例和 root 对象的实例时:

string prevalenceBase = Path.Combine(Environment.CurrentDirectory, "data");
PrevalenceEngine _engine = PrevalenceActivator.CreateTransparentEngine(
 typeof(IssueTrackerLib.IssueTrackRoot), prevalenceBase);
IssueTrackerLib.IssueTrackRoot Root = _engine.PrevalentSystem
 as IssueTrackerLib.IssueTrackRoot ;

第一条语句只是为数据文件创建一个目录。 第二条语句激活了流行。 第三个提供 root 类的实例。

创建一个新的Issue 现在很简单:

Issue newIssue = new Issue(IssueAreaId,.. ...);
Root.Insert(Issue);

就像上面所见,Insert 方法只是设置主键并将它的存储在它的问题字典中。 前面的commandlog我说过,在一个命令被记录到文件的情况下,可以以恢复数据存储的状态。 这就是. NET 反射出现的地方。 如果查看 IssueTrackRoot的类定义,你将看到以下内容:

[Serializable]publicclass IssueTrackRoot : System.MarshalByRefObject {

IssueTrackRootMarshalByRefObject 继承。 流行引擎用这个来插入代理服务器。 所以调用 Insert(newIssue) 时,首选引擎和serialised将在执行前将调用截获到日志文件。

获取和更新对象同样简单:

Issue anIssue = Root.GetIssue(id);
anIssue.Status="Closed";
Root.Update(anIssue);

Issue 具有指向 IssueArea的外键- 如果要获取现有的IssueArea的所有问题,请执行以下操作:

IssueArea anIssueArea = Root.GetIssueArea(id);
IssueCollection relatedIssues = Root.GetIssuesAllFor(anIssueArea);

在这里,我没有接触 IEditableObject,但是在. NET 帮助中看看这个主题。

Points of Interest

ZIP文件还包含一个读取访问文件并生成数据文件的应用程序。 这已经从较大的构建环境中提取出来,因此你需要适应数据库路径和引用。

如果你需要更多细节,并关注未来版本: 看看 http://users.bigpond.net.au/Meyn/Bamboo

很多感谢来自 Egghead Bromberg ( http://www.eggheadcafe.com )的来激励我从一个错误的V 0.2移动到一个相当稳定的V0.4.

历史记录

2003-10-31

  • 初始帖子。


文章标签:数据  PRE  REL  MOV  Relational  关系数据库  Bamboo  bam  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语