1 / 8
文档名称:

状态对象:数据库的替代者.doc

格式:doc   页数:8页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

状态对象:数据库的替代者.doc

上传人:fy5186fy 2016/6/12 文件大小:0 KB

下载得到文件列表

状态对象:数据库的替代者.doc

相关文档

文档介绍

文档介绍:状态对象:数据库的替代者状态对象:数据库的替代者板桥里人 6/1/2 (转载请保留) 这是一个实战中非常重要但是容易被忽视的概念,说它重要,是因为它比数据库重要; 说它容易被忽视也是同样的原因, 它经常被数据库概念替代。如果你经验和经历中没有状态这个概念,极端地说:可能你的 Java 系统经验还未积累到一定程度,状态是每个 Java 程序员深入 Java 系统后必然碰到的问题。本文我想试图表达的是: 状态分两种: 活动的状态对象和持久化的状态。而数据库中的数据只是状态的一种持久化结果,而 Java 系统运行时,我们更多的可能是和一种活动的状态打交道,这种活动的状态存在内存中, 而不是持久化到硬盘上, 当然, 需要时你可以通过数据库/ 文件持久化到硬盘上。但是, 如果你以数据库数据替代状态, 那么就可能导致数据库的频繁访问,而且你的系统会变成一个非对象化的、紧耦合、到处是分散数据块的糟糕系统。这样的系统并不比传统的两层结构好到哪里!也不会比 Jsp 里嵌入 Java 代码伪三层系统高明到什么地方。什么是状态? 只要有对象就可能有状态, 任何一个对象活动时, 都有自己的状态属性,类的字段属性极有可能成为状态,我们现在经常使用的 Domain model 其实就是一种包含状态的对象,如果你对状态没有深入掌握,就不可能真正掌握对象系统特点,或者是 Domain Model 的执行情况。对于初学者, 经常会疑问: 我是将数据放在 HttpSession 中还是 Request 中,这里其实已经开始接触状态,一旦你接触状态,你就要开始小心,因为你可能会将内存泄漏的恶魔导引进来。内存泄漏的恶魔爆发时刻取决于你状态的生存周期和系统并发访问量。状态的生存周期也就是包含这个状态的对象的生命周期, 在简单系统中, 我们只需要通过 new 创建对象, 然后它的消亡就会依靠 JVM 垃圾回收机制回收,但是事情会这么简单吗? 状态的危险还会发生在多线程环境下, 当多个线程对同一个内存中状态写操作时,这时怎么办?如果这个状态持久化在数据库中,我们会依赖数据库提供的强大事务机制防止这种并发死锁, 但是如果是在内存中, 你就很难办, 因此, 我们就尽量避免发生这种多线程同时访问一个状态的现象,而 Singleton 单例模式极容易发生这种现象, 因此实践中, 单例模式是 J2EE 开发中需要避免的, 相关帖子讨论见: e/?forum=91&thread=17578 我们接触的 Web 容器或 Jsp/Servlet 本质就是一个多线程, 这也是很多初学者不知道的, 因为多线程编程是复杂或困难的,因此才有 jsp/Servlet 这样的上层封装,但是我们使用他们时,实际在进行多线程编程。生命周期和多线程并发使得我们简单的面向对象系统变得异常复杂和难以掌握起来。下面我从这个两个角度, 给出两种模式思维解决之道。生命周期(Scope) 生命周期(Scope) 就是指状态的活动周期,状态对象是什么时候被创建; 然后什么时候被销毁, 很显然, 如果状态对象还没有被创建或已经被销毁, 你再访问这个状态对象可能失败, 而状态的生命周期控制是可能散落在运行程序的各个地方, 如果不象状态模式那样进行统一控制,有可能整个系统是危机四伏的。状态的生命周期其实就是对象生命周期,更加细