`

大家来一起讨论如何通过Hibernate提高访问数据库的速度

阅读更多
  
  引子:最近本人正搞一个项目,项目中我们用到了struts1.2+hibernate3
由于关系复杂表和表之间的关系很多,在很多地方把lazy都设置false,所以导致数据一加载很慢,而且查询一条数据更是非常的慢,今天我设置下二级缓存 效果不大,我想肯定还有更好的方法,比如Hibernate.initialize 还有迫切连接等方法
请大家多给点意见。

   解决思路:


   首先必须明白:性能问题完全取决于你的业务设计问题,而不是某个具体架构技术的性能。

你的业务设计采取面向数据表分析,导致关系复杂表和表之间的关系很多,这是你的系统性能问题最本质原因,只有使用DDD重新分析你的系统,才从根本上改观。其他只是一些小修小打的微调,不能根本解决问题。 

  
   使用Hibernate前提必须掌握领域建模的方法,也就是Evans DDD,至少了解类关联的意思和本质。

我们以前很多程序员都是基于数据表编程的思路,现在使用了Hibernate这样的ORM,Hibernate替代了数据表,或者说;插在了数据表和程序员之间,程序员就看不见数据表了,程序员必须学会和Hibernate代表的对象打交道,如果还是念念不忘数据表,那么每次用Hibernate,总是要转个弯,就不自然而且不方便。

换句话说:只有程序员真正掌握面向对象的分析设计和编程,才会觉得使用Hiberante等ORM工具是一个最简单的方式,否则,反而觉得数据表JDBC是一个简单的解决方式。所以,可以从是否善用Hibernate看出程序员的OO素质。当然,不是完全使用DDD来设计就能提高性能,还需要依赖自己对缓存的掌握和灵活控制,我的建议是这样:简洁直接的业务建模+缓存优化。


   最近一篇谈lazy 的文章,提供参考:
Lazy Loading is Easy: Implementing a Rich Domain Model
http://today.java.net/pub/a/today/2006/07/13/lazy-loading-is-easy.html
其中有一句:
First off: why would you want to do lazy loading? The most important reason is to be able to have a clean domain model.

为什么你需要赖加载?最重要的是必须有一个干净的域模型Domain Model!这篇文章就是谈如何实现一个胖模型。




  
   有些人主动或被动把SQL搞得很复杂,这本身就背离了OR MAPPING的初衷,也背离了持久曾的实质.
好的DB设计不会有复杂的SQl代码,基本就是简单的CRUD语句,在它上层再用一层Service实现复杂的业务机制.当然,这必须在领域对象已经清晰的情况下. 另外在用户闲置时间做一些数据处理工作也是很好的,等用户登录后直接就呈现给他,不用被动的等待命令再行动.

   这个世界上的软件并不永远只有CRUD这种操作,统计/分析/报表等等同样是必不可少的,如果捆绑上hibernate,就如j10a所说,绝对会在性能上走向死亡。
通常我会在项目中同时使用hibernate和jdbc,当然,会有自己的封装。
单纯做ORM,我倒是觉得itabis是个更好的选择。


   如果不能掌握Domain Model的设计方式,使用ORM是比较艰难的。不如No ORM,看看TSS前段时间讨论的:No ORM: The simplest solution
http://www.theserverside.com/blogs/thread.tss?thread_id=41715

非常有意思,当初Hibernate刚出来时,有人和我争辩:NO EJB,NO EntityBean,大肆指责EJB实体Bean使用复杂,推崇Hibernate,如今还是同样的轮子,说明主要问题是我们建模方式不对,


   因为从数据表建模的思路转变到对象建模思路,我也有过这样的经历,以前设计系统时都是从数据库建模开始,这样的问题是如果你采用对象的方式编码的话,很多问题都出来了,结果项目的代码也被改动的的很多,而且维护也很麻烦。现在我如果从头设计一个系统,我往往先是业务对象建模,业务对象先运行起来,在用代理模式或装饰模式给业务对象增加防问数据库的能力。这样代码改动量虽然没见得减少,但改动的范围缩小了,控制在几个类之间,而且便于维护。


  
分享到:
评论

相关推荐

    Spring数据库访问之iBatis

    为了丰富博客专栏【Spring数据库访问系列】的内容,完善Spring数据库访问的体系,现在我们介绍Spring对iBatis的支持。 相对于Hibernate等ORM框架的全自动SQL,那么iBatis则属于半自动化的ORM框架,我们需要编写SQL...

    Spring 3.0就这么简单源代码

    本书主要介绍了Spring 3.0的核心内容,不仅讲解了Spring 3.0的基础知识,还深入讨论了Spring IoC容器、Spring AOP、使用Spring JDBC访问数据库、集成Hibernate、Spring的事务管理、Spring MVC、单元测试、敏捷开发...

    基于JAVA的留言板管理系统的毕业设计.doc

    网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻 辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发 变得迅速和容易。 1.2.JAVA语言简介: Java语言其实...

    JAVA毕业设计之基于springboot的疾病防控综合系统的设计与实现(springboot+mysql)完整源码.zip

    Redis:可能用于缓存数据,提高系统响应速度。 Swagger:用于生成API文档,方便开发者了解和测试API接口。 功能方面,系统可能包括以下几个核心模块: 用户管理:包括注册、登录、权限分配等功能。 疾病信息管理:...

    jboss中文文档

    其二,如何通过 Java 客户应用访问该 Web 服务。 再然后,第 6、7 章分别给出了 JMS 和消息驱动 Bean、容器管理持久化的介绍。 第 8 章,探讨数据库的配置。我们将一步一步教会开发者,如何配置、使用MySQL 和 ...

    JBoss中文文档(pdf版)

    其二,如何通过Java客户应用访问该Web服务。 再然后,第6、7章分别给出了JMS和消息驱动Bean、容器管理持久化的介绍。 第8章,探讨数据库的配置。我们将一步一步教会开发者,如何配置、使用MySQL和Oracle数据库。作为...

    iBATIS SQL Maps 开发指南

    使用SQL Map,能够大大减少访问关系数据库的代码。SQL Map使用简单的XML配置文件将Java Bean映射成SQL语句,对比其他的数据库持续层和ORM框架(如JDO的实现,Hibernate等),SQL Map最大的优点在于它简单易学。要...

    Spring面试题

    1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射...

    蝙蝠在线考试系统 v2.2.6.rar

    本系统采用JAVA技术构建,中间层与数据访问层采用了SPRING技术和HIBERNATE技术,数据缓冲、大并发数据访问支持能力卓越,这种能力在多用户同时考试生成试卷和同时提交试卷并计算得分时非常重要,出现卡死的可能性较...

    springboot信息化在线教学平台的设计与实现.zip

    技术栈方面,除了Spring Boot作为主要后端框架外,该项目可能还使用了如MyBatis或Hibernate的ORM框架,MySQL或PostgreSQL作为数据库,Redis用于缓存,以及前端技术如AngularJS、React或Vue.js等。该资源包适合软件...

    蝙蝠在线考试系统 2.2.8.rar

    本系统采用JAVA技术构建,中间层与数据访问层采用了SPRING技术和HIBERNATE技术,数据缓冲、大并发数据访问支持能力卓越,这种能力在多用户同时考试生成试卷和同时提交试卷并计算得分时非常重要,出现卡死的可能性较...

    iBATIS实战

    书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的...

    iuhyiuhkjh908u0980

    希望大家能帮我找出问题来数据库:uYou if exists(select * from sysobjects where name='users') drop table users go create table users ( uid int identity(1,1) primary ke ... by yinhao131415 2008-03-05 ...

    antlr4权威指南

    Hibernate对象-关系映射框架(ORM)使用ANTLR来处理HQL语言。  除了这些鼎鼎大名的项目之外,还可以利用ANTLR构建各种各样的实用工具,如配置文件读取器、遗留代码转换器、维基文本渲染器,以及JSON解析器。我编写...

    Grails权威指南

     11.2 通过集成hibernate实现orm  11.2.1 使用hibernatecxml映射  11.2.2 ejb3方式的映射  11.2.3 在pojo实体中使用约束  11.2.4 得到sessionfactory对象  11.3 使用spring进行依赖注入  ...

Global site tag (gtag.js) - Google Analytics