在前面,我们学习了解到了cache数据库的存取模式。
1.采用多维数组存储数据。
2.可以利用各种技术存取数据。
cache数据库有一个 多维数组引擎。还有一个分布式缓存协议。使得存取速度快,实时处理数据。
它提供了以下用途。
1.数据存储
2.并发管理
3.事务处理
4.过程管理
接下来学习四个方面的存取
1.web存取 cache服务器页面(CSP[cache server page]),在数据服务器上运行,与他们存取的数据放在一起。
2.对象存取 cache支持多种面向对象建模技术。可以和rartion rose(如今已并入IBM)双向开发。
3.SQL存取 SQL92,SQL网关技术,可以和其他关系型数据库共存,集成整合工作环境。也可以将关系型数据库迁移到cache上。
4.多维存取 兼容OPEN M语言程序。
什么是多维数组(GLOBAL)?
一种类似树的存储形式。定义形式为
^GLOBAL(“节点1”,"节点2”,"节点3”)=“数据”
我们可以建立自己的GLOBAL,添加删除修改遍历其节点。
在这个基础上,将GLOBAL可以映射为对象或者关系型格式,从来利用对象接口或者基于Sql接口进行访问。
**在实时事务处理冲,推荐直接操作GLOBAL树,以底层的方式快速访问cache数据。
现在开始将怎么访问
1.通过关系方式查询
也就是SQL语句。cache支持SQL92标准【不知道最新版支持哪一个标准了】。通过SQL语言,我们可以创建访问表[table],视图[View],存储过程[Store Procedure],触发器[Trigger],游标[Cursor].当然我们也可以用OBDC或者JBDC来访问。
配置ODBC源方式就不讲了。如不清楚,百度之。推荐sqldbx这个工具。
2.用对象方式查询
a.打开对象
Set p=##(包名.类名).%OpenId(Id)
*注意区分大小写
*%OpenId继承于%Presistent
W p
屏幕将会显示 1@包名.类名.
表示 类-包名.类名在本用户进程中第一个实例的引用。
变量p本身保存的内容只是对 对象在内存中版本 的引用。称作为是OREF(Object REference)
b.访问属性
和平常访问属性一样
w p.属性n(n=1,2,3……)
当然,我们也可以修改,set就可以了。但是此时只是对内存中数据的修改。如果要保存,还是需要调用%Save方法来保存
c.调用方法
在cache中调用对象方法和我们平常用的方式相同。格式如下:
Do 对象.方法(参数1,参数2,参数3……) *没有返回值的时候要用Do。
假设p中有方法Get(),我们调用Get()就是:
w p.Get(),!,p.%Id()
*如果没有参数的时候()要保留。
*!是换行
*%Id是返回p的Id值。
如果要把修改后的数据保存下来,调用%Save
w p.%Save()
如果保存成功,则返回1,屏幕上将会显示1
如果保存失败,则返回0.
*COS的语法和其他面向对象语言的语法很像,都是把一系列复杂的方法和属性的调用放在一行语句里面。
d.访问其他属性
操作一致,撸过。
e.输出xml
XML文档的结构化形式可以很好的描述复杂的对象。cache有很强大的XMl处理能力,包括将类或者对象输出成为XML文件。
在本例中(代码之后发布,现在还有问题,%Save不成功),我们可以通过person的祖先类(我的理解就是定义person类的时候,他的一个参数)%XML.Adaptor提供的方法来输出XML文档。
I.我们可以先将Manager类的类定义输出为XML SCHEMA格式的文档定义。
LIFETRA(类所在的命名空间)> Do ##class(space.Manager).XMLSchema()
然后将文档输出为XML格式的文件
LIFETRA>Do p.XMLExport()
* 无参数只是默认状况。我们可以改变参数,让文档按照特定的规则输出,或者输出到外部文件或流中。
* Caché 不光能输出XML文档,相反地,还可以从外部 XML文件中产生对象。
* Caché 支持自动垃圾回收。也就是说,如果我们不手动删除aPerson 对象,当我们关闭终端( 即一个用户进程结束) 时,Caché 也会将它删除.
f.关闭对象
LIFETRA>Do p.%Close()
LIFETRA>Kill p
3.查看GLOBAL
在cache中,无论表和持久化的对象,都是一同一种方式GLOBAL保存在数据库中,只是我们以不同的机制将他们投影[Project]成为对象或者关系的形式。
a.可以通过GLOBAL查询控件来查询
这个比较简单。
b.也可以在程序中用COS直接来访问。
w ^名称(下标……)
* 必须有符号 “^” ,否则操作的将是局部变量,该变量只会在用户进程的内存中存在
也可以set赋值
kill删除节点