论坛首页 Java企业应用论坛

我刚刚开始接触Hibernate的时候写的一个帖子

浏览 11476 次
该帖已经被评为精华帖
作者 正文
   发表时间:2003-09-16  
我最近对O/R Mapping也非常着迷,仔细研究了JDO规范和一个非常棒的O/R框架Hibernate。

O/R 除了那些宣传的不用写JDBC代码,减少代码量,增加Cache等等普通功能的增强之外,最吸引人的地方在于:

1、动态构造SQL

使用JDBC,当发送带参数的SQL时候,必须使用PreparedStatement,不能使用Statement,否则会带来严重性能问题,会造成数据库瘫痪。但是项目中会经常遇到参数不确定的情况,必须动态构造SQL。这时候只能迁就项目,使用Statement。给软件运行留下了深深的隐患。

但是O/R Mapping通常都可以支持动态SQL。像Hibernate通过reflection动态构造出PrepareStatment对象,解决了这个大问题。

2、真正以对象的方式来操纵数据库存储。

JDBC是按照关系数据方式操纵数据库的,所以把业务层的值对象往数据库映射非常别扭。有经验的人都有这样的感觉,特别是对应复合对象,聚和对象,映射数据库的时候很麻烦,在JDBC代码中要做很多转换操纵。

将JDBC完全封装成了持久对象的操纵。这样可以真正实现软件设计OOD自上而下,设计出持久对象之后,再映射出数据库表。Hibernate还支持使用工具自动生成对象数据映射描述XML和数据库DLL,或者相反。这样可以实现完全的OO编程。

3、复合持久对象的延迟加载技术(Lazy initialization)

具有聚和关系的持久对象往往表现为数据库中1:n关系的使用外键连接两个表。如果想要得到n个复合持久对象,就必须对每个对象的集合属性再查询一次外键关联表,因此总共需要n+1次SQL查询,假设每个对象的集合属性包含m个关联对象。那么就需要在内存中分配(m+1)*n个对象。如果关联对象还是复合对象的话,假设关联对象的集合属性包含k个对象那么就需要n+1+nm次SQL查询,需要内存分配n+mn+mnk个对象。不论内存还是查询时间都无法忍受。而实际上并不需要把所有的相关信息都取出来。

实际上,复杂的项目中,存在这样关联关系的数据表比比皆是。所以JDBC处理这样的问题更棘手,只能修改值对象的设计,来适用数据设计。这样会破坏了原来的OOD过程。

O/R Mapping一般都支持延迟加载,复合对象的集合属性是不会立刻从数据库中取出来的。这样当在页面分页显示复合对象,而不需要使用其集合属性时候,只有1次SQL,取出n个对象。当进入某个明细页面,需要显示某个复合对象的集合属性的时候,才会从数据库中真正执行1次SQL,把该复合对象对应的关联表记录取出来,这样有1次SQL,取出m个对象。

由于只在需要使用的场合才取相应数据,就避免了上述的两难,既可以用OO设计数据库和持久对象,又可以得到很好的性能。

在使用延迟加载的时候,由于数据库连接不能关闭,必须使用完才能关闭,因此可以把数据库连接对象放在ThreadLocal中,这样在一个程序和用户的交互整个过程中,在该线程的任何地方都可以取到数据库连接。所以在控制逻辑的Servlet最后关闭连接,就保证了操作的安全。
   发表时间:2003-09-16  
EJB我感觉还是要用的,只要你觉得你开发的项目将来有可能把业务层和Web层分开放在不同的机器上的话就一定要。

比如说,对应访问请求相对比较大的项目(或者预期将来会比较大),Web层应该单独放一台机器了,可以采用Apache + Servlet Container,而业务层是比较繁重的,单独放一台或者几台机器,运行App Server,后端放一个DB Server。

这样的话,起码你会想到把业务层的接口用Session Facade实现,其实也不会复杂多少,但是立刻就具备了分布式、事务处理和对象池管理的功能。当然在这种粗粒度情况下,最好不要在Session Facade里面管理事务,否则事务的范围过大会引起互锁,那么由于BO是用一般的Java对象实现,因此在此种情况下,恐怕要在Session Facade里面使用Bean管理事务了,或者在BO里面使用JTA。但是我觉得用Bean管理事务丧失了很多灵活性,有些可以组合的事务会被分成多个事务执行,引起效率降低。

因此可以这样认为,在业务层,如果事务相对简单,那么BO用一般Java对象实现,如果事务比较复杂,特别是跨多个资源的事务,那么BO采用Session Bean。

我感觉,EJB总是要用到的,不管是出于分布式,还是事务管理和协调的考虑,但是只用Session Facade的时候,软件并不会复杂多少的,即使BO用Session Bean,也不会增加多少复杂度,此时复杂度主要表现在事务的管理上。

我的主张是除非小型项目,否则我起码会用Session Facade。
0 请登录后投票
   发表时间:2003-11-17  
robbin 写道

我的主张是除非小型项目,否则我起码会用Session Facade。


to robbin,  可否贴个例子来说明sessionFacadeBean与hibernate一起工作的例子?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics