浏览 11476 次
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-09-16
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最后关闭连接,就保证了操作的安全。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间:2003-11-17
robbin 写道 我的主张是除非小型项目,否则我起码会用Session Facade。 to robbin, 可否贴个例子来说明sessionFacadeBean与hibernate一起工作的例子? |
|
返回顶楼 | |