状态对象:数据库的替代概念


这是一个实战中非常重要但是容易被忽视的概念。说它重要,是因为它比数据库重要;说它容易被忽视也是基于同样的原因,它经常被数据库概念替代。

状态对象:数据库的替代概念

http://www.jdon.com/artichect/state.htm

状态和属性难于区分是一大难点,在UML设计中通常会使用Peter Coad等人的四色原型(Archetype)来帮助人们分辨或找出它们之间的区别:


通过划分出一些特征和行为模式,可以帮助我们快速构造出健壮的、可扩展的对象模型,迅速掌握有可能被忽略的属性和操作,增强我们对代码结构的信心。

上图显示了我们可能在各种原型的类中找到的属性和操作,以及各种原型之间的典型关系。

使用粉红色标识的<<moment-interval>>类表示这是可能消逝即纵的一些活动或事件,当然这些活动是以状态数据为标记特征的,例如图中的Momentinterval类中的status状态字段。

关于UML四色图网址描述:

http://software.ccidnet.com/art/322/20021028/28880_1.html

Archetype Patterns 和UML MDA相关资料:
http://www.informit.com/bookstore/product.asp?isbn=032111230X&rl=1


我会近期贴出一些好的最新的英文资料帮助大家学习。

刚才上面关于Building Better Software with Archetype Patterns and UML书籍链接没有太多内容介绍,不好,这里重新给个链接:

http://www.aw-bc.com/catalog/academic/product/0,4096,032111230X-PRE,00.html

翻译大意资料:

这是来自实战的一本书,我们希望节省你在软件开发中的大量时间和精力,它给你一系列的archetype patterns 和原理,在以后时间内,我们希望发布一系列有效的archetype patterns。

Archetype patterns原型模式是一个高价值模型组件,你能够容易在UML建模使用它们,每个原型模式提供了可理解的业务建模解决方案。这些模式是高价值而且相似的,但是不太成熟,一些模式被$300,000标价,原文:These patterns are valuable―a similar, but much less mature, set of patterns was recently independently valued at about $300,000 by a blue chip company.

使用这之中任何一个模式,甚至模式的片断,也许会节约你几天甚至几个月的工作时间,甚至更重要的是:这些模式也许阻止你付出昂贵的错误探索代价!

在2003年我们开始考虑,我们在一个软件革命的开始,它象90年代我们看到的面向对象编程从传统过程语言中抽象出来一样。

我们相信我们看到的是以后这十年,更有意义的抽象级别的发展,这将是一个以代码为中心的软件开发方式的根本改变,这就是通过 OMG’s Model Driven Architecture (MDA).

我们希望这些概念和技术或工具以及模式能够帮助我们将这软件革命变成现实。

我2003年做企业培训时就说过:Java(或者.NET)实战经验过关的标志就是:你是否搞明白Session和Pool的区别。

这个概念是实战中不可避免的,其实这就和状态有关,如果你没有丰富实战经验,或者即使有,也只是数据库为中心的编程,就是使用Ioc/AOP又有什么好处呢?

其实这也和状态有关,Session和Pool的区别取决于你的应用设计是否有状态,这就是谜底,我一直未在网上说,我是想看看各路高手有无此认识。

如果你没有来自实战对状态的领悟,你就会范下面错误,甚至和人辩论,范“无知无畏”的初级错误。:

1.肆无忌惮使用Singleton单例,
2.肆无忌惮地使用httpSession
3.肆无忌惮地否定EJB,特别是有态Session Bean,就象Hibernate 发明者Gavin King肆无忌惮在TSS抨击EJB,被一些人翻译汉化复制到本站论坛,所以才有CMP vs EJB等讨论,Gavin King自己最后醒悟发表著名的关于有态stateful 的文章。
4.肆无忌惮地使用Spring这些无状态管理的框架。你可以说90%无需集群,但是每个系统都是需要状态的。

下面转贴在清华BBS上“肆无忌惮”发表言论的一个帖子:


http://www.smth.edu.cn/bbsanc.php?path=%2Fgroups%2Fdevelop.faq%2FJavaExpress%2Fjavaprogramming%2FJ2EE%2FAOP%2Fgty5
☆─────────────────────────────────────☆ gty (宜良-丽江-蝴蝶泉) 于 (Fri Feb 21 02:33:56 2003) 提到:Session Pool Design1. 利用apache common-pool实现一个Session Pool(非常简单)


批:是一个谈AOP的帖子,如何使用AOP实现POOL,可惜作者使用Session Pool, Session就是Session; Pool就是Pool,是不同两个东西,他要谈的是Pool,但是前面加Session,可见其实战经验薄弱;

行家伸伸手;便知有没有,只有初学者才会被繁话美景迷惑,发出你的功底真厚的感慨,还是尼采那句话:太阳死了,没有人值得你敬佩;只有你自己。

好好学习,2006年我们一起来学习即将替代OO,被老马微词的,即将带来后十年软件革命的MDA吧,先从四色原型模式开始。

bang:"我2003年做企业培训时就说过:Java(或者.NET)实战经验过关的标志就是:你是否搞明白Session和Pool的区别。

这个概念是实战中不可避免的,其实这就和状态有关,如果你没有丰富实战经验,或者即使有,也只是数据库为中心的编程,就是使用Ioc/AOP又有什么好处呢?"


我也具体讲不清楚Session和Pool的区别,我个人不喜欢用Session,碰到要保存状态的用隐藏表单,多了也很麻烦!javaScript触发事件,非常烦!感觉就象在吃"苍蝇",用Session有后遗症,也不好处理!

特别是做RIA应用,状态多,检测多!控制状态和做检测要花很多时间,改BUG改的很老火!

JSF,tapestry都不能很好的很轻松的完整的解决问题!也许是我还"很菜"
AJAX也不是神话!

>我也具体讲不清楚Session和Pool的区别,我个人不喜欢用Session,碰到>要保存状态的用隐藏表单,多了也很麻烦!javaScript触发事件,非常>烦!感觉就象在吃"苍蝇",用Session有后遗症,也不好处理!

是的,能不用Session尽量不用,但是业务逻辑有时需要这样的Session状态,比如一个用户在浏览商品,不断把商品放入购物车,这个购物车就必须使用Session实现。

Session是一个希望回避,但是无法回避的问题,其实我们的业务实现就包括无状态和有状态两种类型。而Spring这样框架是一种无状态/单态的框架,少了一只腿,怎么办呢?

打个标。

为什么还要扯上spring,spring只是一个IOC容器而已,跟主题好象不相干吧。
还有提个小小的意见,我用OPERA访问J道,总是乱码,非得将浏览器的编码硬性设置成GBK才成,能不能处理一下,弄得浏览非常不便,在别的网站都不会有这个问题

这篇文章给我的感觉就像是现在很多集群都是WEB集群,国内好象没有很多系统用到分布式缓存系统吧。但是做缓存的系统还是有很多的,他们把握状态的能力似乎也不错。除了EJB还有什么好选择吗关于集群环境中application级的对象状态同步问题

>关于集群环境中application级的对象状态同步问题

Tangosol提供分布式数据管理平台,它能够被嵌入大多数J2EE容器中。

也提供分布式缓存系统能够在不同JVM中共享Java对象状态。

“http://www.tangosol.com/”

还有JBossCache

数据库的查询搜索功能使用状态对象能解决吗?特别是对结果的排序的问题,如果是拿出了部分的结果集合后再进行排序,就不符合要求了。

比如:
商品分类
|
--彩电
| |----TCL
--空调
|........

在上边的树目录叶子节点上对应的有商品数据。
TCL24寸银白彩电 ,海尔GBL空调等等。
现在需要进行商品数据信息,搜索要求为:搜索商品分类这个节点下所有商品名字中包含“GBL”的数据。即对某个节点下的商品信息进行有条件的搜索。

我现在是维护了一个父子关系的中间表,然后直接通过节点id(“商品分类”这个节点的Id)的in子集来进行sql搜索。因为维护这个父子关系的中间表的问题,感觉很不好。

如果使用状态对象保存了部分数据,那么就不知道怎么来进行查询搜索了。难道我要先在内存中查找然后再去数据库?

各位大侠有什么好的解决方案。我在面向对象编成方面,也是一直困惑于这样的数据查询的困惑。