`
raymond2006k
  • 浏览: 295570 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

领域模型的超延迟加载初步设计

阅读更多
最近,taowen 同学引发的 领域模型的价值与困境等讨论,非常热烈。

尤其taowen 在 贫血的Domain Model 中的RichSet  设计和我想到一处去了,呵呵。我顺带补充一下就 RichSet 我的想法,欢迎拍砖。

    经常见到有朋友担心这样的问题, hibernate下 user.getTasks(), 一加载,所有的关联数据就都load到内存里了。 其实按理 Framework 设计人员应该解决这个棘手的问题。

因此应该给集合类,List,Set,Bag等赋予行为,采用Super Lazy Load。超延迟加载技术。
1)  user.getTasks() 时,不去load数据。 tasks.get(0), 时采取load数据;
2)  tasks.get(0),并不全部load数据,采用分页方式,默认 pagesize可以配置,load出第一页数据;
3) tasks.get( x ), 也只load出 x 所在页的个记录。
4) 数据集合 tasks 作为一个 集合实例,应该保持一个query condition对象,以便在需要的时候和 持久层(可以是 DB,文件,内存,或另一个WebService系统)进行同步。
5) user.getDpartment() 这样的对 1 的关联也可以 lazy(目前hibernate等是支持的),super lazy load 下,可以在第一个属性访问的时候,例如 department.getName() 的时候,再去load。当然,策略可配。

大量数据的加载效率,重复加载等,由 cache 系统保证。
这样设计的目标就是让将 bulk 数据加载和处理的问题放回到底层,让程序员中心放到领域模型的业务上去。
分享到:
评论
15 楼 llade 2008-12-14  
crazy.j 写道
nihongye 写道
hibernate老早就支持!...

呵呵 是啊。。。但是我总觉得那个东西用起来晕得要死,不如直接写HQL。


DetachedCriteria直接使用貌似没有什么价值的。但对于上百个表,上千个字段(假设平均每个表10个),之间关联关系复杂的,而用户需求又多变的。无论在重构和代码的管理上都比HQL要好很多。写HQL也好,SQL也好,DetachedCriteria也好,都需要去查entity的对象关系图,因为太多字段,太多entity了。现在基本是用PowerDesigner管理这些表,然后再用工具生成DAO,这些DAO带有一种"script"的性质,带有一个生成的、辅助的DetachedCriteria操作对象,利用JAVA IDE的"."自动显现对象方法的功能,可以使得开发人员不必老是去查各种表的关系,无论是对于开发、团队合作、后期维护、较复杂的重构,都能节省不少工作量。在实际的应用中确实是一种节省成本的做法,最简单的一个例子,entity发生改变,几乎所有需要修改的文件都会出现红色的"x",因为编译错误,而HQL的错误,你只有用测试和代码搜索的功能来定位了,而且漏改的可能性很高。
   从代码书写的灵活性来说,动态语言的无疑会比静态语言高很多,像RUBY这样进化很快的动态语言尤其如此,但对于一个不断变化的需求的现实世界,如何更好的管理散漫到各个地方的代码进行有效管理呢?我个人觉得静态语言仍然有其优势的。不过当哪一天IDE的发展可能会弥合这种差别,现在JAVA这样的静态语言的"动态扩展"可能会是一个发展方向。
14 楼 xieke 2008-12-12  
raymond2006k 写道
taowen 同学,你的作品正在拜读。 初看很不错,读完了再交流,呵呵。我也在做这样的小研究。

svn拉下来,
看到好多模板和接口,一头雾水,那位同学看懂了解说一下哈
13 楼 raymond2006k 2008-12-11  
taowen 同学,你的作品正在拜读。 初看很不错,读完了再交流,呵呵。我也在做这样的小研究。
12 楼 raymond2006k 2008-12-11  
llade 写道
或者:
lily.getCondiction().enter("children").eq("name","Tom").and().qe("isMale",true).or().eq("name","Beth").list();
//enter("children")表示进入子实体。
扩展一下。
或者lily.getCondiction().enter("children").enterQuote().eq("name","Tom").and().qe("isMale",true).endQuote().or().eq("name","Beth").list();



这种方式还是没有 HQL,SQL等查询语言那样直观和易维护。
//等价script:(name = 'tom' and isMale ) or name = 'Beth'.   这种更好一些。

到领域模型这里,我觉得以下方式好一些:
child.setName("Tom");
child.setSex("1");

map.put("otherName","Alice");
liy.getChildren().query("name = :name && sex = :sex  or name = :otherName",child,map  );

query(exampleObject);  //QBE
query(queryString, exampleObject); //query string + QBE
query(queryString, exampleObject,otherParamMap); //query string + QB + other param
queryByName( namedSqlName); // named query


这三个接口也是我设计的查询的四个接口,没有其他。 简单的用前两种, 复杂的用 named sql query。Hibernate,Ibatis 都是支持的。

Criteria我不太喜欢采用。

11 楼 crazy.j 2008-12-11  
nihongye 写道
hibernate老早就支持!...

呵呵 是啊。。。但是我总觉得那个东西用起来晕得要死,不如直接写HQL。
10 楼 nihongye 2008-12-10  
hibernate老早就支持!...
9 楼 llade 2008-12-10  
不过感觉已经是在写类 HQL 的script了。呵呵
8 楼 llade 2008-12-10  
或者:
lily.getCondiction().enter("children").eq("name","Tom").and().qe("isMale",true).or().eq("name","Beth").list();
//enter("children")表示进入子实体。
扩展一下。
或者lily.getCondiction().enter("children").enterQuote().eq("name","Tom").and().qe("isMale",true).endQuote().or().eq("name","Beth").list();
//等价script:(name = 'tom' and isMale ) or name = 'Beth'.
7 楼 llade 2008-12-10  
或者:
lily.getChildren().getCondiction().eq("name","Tom").and().qe("isMale",true).or().eq("name","Beth").list();
6 楼 llade 2008-12-10  
我心目中的代码是这样的:
lily.children.findBy("name","Tom").and().findBy("isMale",true).or().findBy("name","Beth");
//等价script:name = 'tom' and isMale or name = 'Beth'.
5 楼 llade 2008-12-10  
扩充的可查询的Collection类,我觉得应该支持一种类似xpath或者el表达式的根据“类script”的方式去设置条件 或者 取对象和对象的集合。api的编程的方式去取总有不灵活的地方。我看了一下Qset的例子,createParameter的返回的是个entity,以entity作为条件类有个局限,隐含的是a = xxx and b=xxx .....,而不能做到a = xxx or b=xxx .....也不能做到大于小于,而且和hibernate的findByExample方式重复的感觉。或者可以说QuaryableCollection查询的扩充只有一种“垂直模式”,复用功能有点弱哦。不过我只是从你的例子上粗粗看的。也可能一叶障目。
4 楼 taowen 2008-12-10  
llade 写道
taowen 写道
QueryableCollection的技术难度攻关已经完成了,还有待进一步完善其功能.代码参见:
http://javaonhorse.googlecode.com/svn/trunk/javaonhorse-query/

看了一下。允许提些意见不?呵呵

当然可以
3 楼 llade 2008-12-10  
taowen 写道
QueryableCollection的技术难度攻关已经完成了,还有待进一步完善其功能.代码参见:
http://javaonhorse.googlecode.com/svn/trunk/javaonhorse-query/

看了一下。允许提些意见不?呵呵
2 楼 taowen 2008-12-10  
QueryableCollection的技术难度攻关已经完成了,还有待进一步完善其功能.代码参见:
http://javaonhorse.googlecode.com/svn/trunk/javaonhorse-query/
1 楼 llade 2008-12-10  
无非三个方式:
1.保证整个线程结束之前session 一直打开。用得最多的是OpenSessionInViewFilter.假如request时间跨度不长的话,首选的方式。
2.“预取”所有需要用到的数据。当然啦,会拔出萝卜带出泥,lazy load Collections 需要自己过滤,而且过滤之后需要很有技巧的使用这个collection,过滤仍然在session关闭前,而且过滤后的collection不能再绑回到root entity上去,否则可能会有严重问题。
3.重新绑定一个新的session。这个是hibernate 文档反对的做法。

第二种方式的难度在于不带出泥,视乎没什么很好的办法,对于user.getTasks()使用不应有两种语义,不应该返回过滤后的集合。2级缓存很好的解决效率问题,只拔一次萝卜,当然啦,过滤还是靠你的程序和你自己的缓存技巧了。

相关推荐

    数据库原理及应用:第五章数据库设计.ppt

    5. 数据库实施:根据设计创建数据库,加载数据,并进行初步测试。 6. 数据库运行与维护:监控数据库性能,解决运行中出现的问题,进行必要的更新和调整。 数据库设计方法有多种,包括手工试凑法和规范设计法。手工...

    电信设备-面向移动终端三维模型流式传输方法.zip

    5. **预加载与缓存策略**:为了减少延迟,系统可以预测用户可能查看的模型部分并提前加载,同时利用设备的存储空间缓存已接收的数据,防止重复传输。 6. **错误恢复机制**:在网络中断或数据丢失的情况下,有效的...

    LOD的大规模真实感室外场景实时渲染技术的初步研究

    - **数据预加载技术**:预先加载可能需要的模型数据,减少延迟并提高响应速度。 - **缓存机制**:利用缓存存储最近使用的模型数据,减少重复加载的时间。 ##### 4. 高效渲染算法 除了模型本身的优化外,高效的渲染...

    Allegro PCB SI: 一步一步学会前仿真

    2. **初步设计**:包括原理图设计、初步布局等。 3. **信号完整性分析**:利用仿真工具进行信号完整性评估。 4. **详细设计**:根据分析结果调整布局、布线策略等。 5. **制造与测试**:完成PCB制造并进行实际测试...

    Allegro_PCB_SI_-_一步一步学会前仿真

    在电子设计领域,高速PCB(印制电路板)设计是一项关键任务,它涉及到信号完整性和电源完整性等复杂问题。为了确保设计的高效性与可靠性,前仿真工具如Cadence Allegro PCB SI变得至关重要。本教程将逐步指导你学习...

    jsp网页设计40种常见的网页技巧

    16. **异步加载图片**:利用JavaScript或CSS延迟加载非首屏图片,加速页面初始渲染。 17. **表单序列化**:使用`jQuery.serialize()`将表单数据转换为URL编码格式,方便AJAX提交。 18. **页面跳转**:`response....

    css2.0中文手册

    3. **提升性能**:CSS2.0允许优化加载策略,如延迟加载和条件加载,从而提高网页加载速度。 4. **丰富的视觉效果**:CSS2.0提供多种样式和布局选项,使网页设计更具创意和吸引力。 **四、CSS2.0中文手册** 提供的两...

    精通Hibernate孙卫琴 pdf

    进一步,孙卫琴老师详细讲解了Hibernate的高级特性和最佳实践,如动态模型、延迟加载、懒加载和级联操作等,这些特性可以帮助开发者在实际项目中更好地优化代码。同时,她还强调了性能调优和问题排查技巧,这对于...

    yolov5摔倒检测源码

    此外,结合云计算和边缘计算技术,可以在设备端进行快速初步判断,减少网络延迟,提升响应速度。 总结,YOLOv5摔倒检测源码利用先进的深度学习技术,实现了高精度、高效率的摔倒检测。其背后涉及的关键技术包括...

    用java实现本地语音实时采取,然后对接阿里AI语音识别实现,语音识别系统。并内部加载逻辑实现电脑语音控制

    为确保系统的实时性和低延迟,需要考虑性能优化,例如减少不必要的数据处理,使用高效的并发模型,以及合理分配系统资源。 9. **安全性与隐私**: 考虑到语音数据的敏感性,开发过程中应遵循数据安全和隐私保护的...

    头部姿态估计-基于OpenCV+dlib实现的实时头部姿态估计算法-附项目源码-优质项目实战.zip

    头部姿态估计是计算机视觉领域中的一个重要任务,它涉及到面部识别、人机交互、虚拟现实等多个应用领域。在本项目中,我们将深入探讨如何利用OpenCV和dlib这两个强大的开源库来实现一个实时的头部姿态估计算法。...

    Druid源码(apache-druid-0.21.1-src.tar.gz)

    5. **数据节点(Historical & Realtime)**:Historical 节点用于存储和查询 Segment,而 Realtime 节点负责实时摄入和初步处理数据,然后将其转换为 Segment 交给 Historical 节点。 6. **索引服务(Indexing ...

    Hibernate 进阶教程

    9. **性能调优**:提供关于如何提高Hibernate性能的建议,如批处理、延迟加载、缓存策略调整等。 10. **其他高级特性**:包括双向关联的维护、集合的有序性和索引、复合主键的处理、子类继承的映射等。 ...

    matlab的ILC仿真程序

    迭代学习控制(Iterative Learning Control, ILC)是一种在重复性任务中提升系统性能的控制策略,常用于机器人、自动化生产线、飞行控制等领域。在MATLAB环境中,我们可以利用其强大的计算和仿真能力来设计和分析ILC...

    Windows游戏编程大师技巧中文第二版带全书签

    9. **资源管理**:讲述如何有效地管理游戏中的资源,如纹理、模型、音频文件等,包括加载、缓存和释放策略。 10. **游戏引擎的使用**:虽然本书侧重于底层编程,但也可能会提及如何利用现有游戏引擎(如Unity、...

    Flink Hive生态兼容性介绍1

    - 随着AI的发展,无论是实时还是批量分析,都对降低延迟有强烈需求,以便更快地训练模型并实时应用。 - ETL(提取、转换、加载)仍然是大数据处理的重要场景。 - SQL是处理大数据的主要工具,无论是流式还是批量...

    51C四自由度双足机器人

    在IT领域,双足机器人是人工智能和机器人技术中的一个重要研究方向。"51C四自由度双足机器人"是一个专为学习和实验设计的平台,它具有四个关键的运动自由度,这使得它能够在平面上进行行走和平衡。在这个项目中,...

Global site tag (gtag.js) - Google Analytics