`

大家来一起讨论如何通过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,如今还是同样的轮子,说明主要问题是我们建模方式不对,


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


  
分享到:
评论

相关推荐

    给hibernate配置文件加密解密的方案

    该方案通过使用 Java 的 Cipher 类和 DES 对称加密算法来实现加密和解密操作。 首先,让我们了解为什么需要对数据库密码进行加密。在一个典型的 Hibernate 应用程序中,数据库密码通常会被写入到配置文件中,以便于...

    Java封装hibernate操作数据库.rar

    本资料包"Java封装hibernate操作数据库.rar"主要涉及了如何使用Hibernate进行数据库操作,并通过DAO(Data Access Object)层的封装来实现更加高效、简洁的代码结构。 首先,让我们深入了解Hibernate。Hibernate是一...

    数据库与Hibernate教案

    通过本教案的学习,你将能够熟练掌握数据库的基本操作,理解Hibernate的核心功能,以及如何利用AJAX提升Web应用的用户体验。理论结合实践,助你在实际项目开发中游刃有余。同时,本教案中的案例和练习将加深你对这些...

    Hibernate数据访问技术大全

    《Hibernate数据访问技术大全》是一本深入探讨Java领域中Hibernate框架的数据访问技术的权威指南。...通过学习这本书,你将能够熟练掌握Hibernate,提高开发效率,实现更加灵活和高效的数据库应用。

    现有Mysql数据库,写Spring + Hibernate的配置文件

    在本场景中,我们将讨论如何在现有MySQL数据库环境下,配置Spring和Hibernate来实现数据访问。 首先,我们需要在项目中引入Spring和Hibernate的相关库。通常,这可以通过在`pom.xml`(如果你的项目使用Maven)或`...

    Hibernate实战

    缓存机制可以提高数据访问速度,减少数据库负载,包括一级缓存(Session级)和二级缓存(SessionFactory级)。性能优化涉及查询优化、批处理、连接池配置等。事件监听器和拦截器允许在特定操作前后执行自定义逻辑,...

    Struts2 Spring3.0 Hibernate3.3 整合全注解配置用的数据库

    这里我们主要讨论如何通过全注解配置来实现这三大框架的集成,并关注它们在数据库操作中的应用。 首先,Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它提供了一种组织应用程序的方式,...

    Hibernate Developer Guide

    缓存是Hibernate中一个关键特性,用来减少数据库的访问频率,提高性能。文档将讨论查询缓存、查询缓存区域以及二级缓存提供者。 从上述内容中可以看出,《Hibernate Developer Guide》是一个全面的文档,涵盖了...

    Hibernate面试题专栏 - 最全的Hibernate面试题, Hibernate笔试题, Hibernate问题

    【标题】与【描述】提及的是“Hibernate面试题专栏”,主要涵盖了全面的Hibernate面试题、笔试题以及相关问题,这表明我们将要讨论的是Java领域中著名的对象关系映射框架——Hibernate的相关知识。Hibernate是一个...

    hibernate实例连oracle

    标题“hibernate实例连oracle”表明我们正在讨论如何使用Hibernate框架来连接并操作Oracle数据库。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来处理数据库交互,而无需...

    hibernate_in_action 源码

    - 对象关系映射:Hibernate 提供了映射工具,将Java类与数据库表进行映射,使得数据库操作可以通过对象来完成。 - 数据库事务管理:支持ACID事务特性,保证数据的一致性和完整性。 - 查询语言:HQL(Hibernate ...

    Spring4+Hibernate4+HTML5WebSocket简单应用示例

    8. **性能优化**:对于大规模用户的应用,可能需要讨论如何通过WebSocket的集群和负载均衡来提高系统性能和可扩展性。 9. **异常处理**:在实际应用中,需要处理可能出现的各种异常,包括网络中断、服务器故障等,...

    HIBERNATE - 符合Java习惯的关系数据库持久化.docx

    《Hibernate - 符合Java习惯的关系数据库持久化》是一份关于Hibernate框架的详细教程,旨在帮助...通过学习,开发者可以有效地将Java对象与数据库表进行映射,实现数据的持久化,从而提高开发效率并减少出错的可能性。

    Hibernate5.2.11高清版,最新版本

    缓存机制(Caching)讲解了Hibernate如何通过缓存减少对数据库的访问次数,以及如何配置和使用不同级别的缓存。 拦截器和事件(Interceptors and events)描述了如何使用Hibernate的拦截器和事件监听器来处理实体...

    hibernate难点重点笔记

    其次,我们来讨论Hibernate的get()与load()方法。两者都是用于根据ID获取对象,但行为有所不同。get()方法假设数据库中存在对应ID的对象,若找不到则返回null。而load()方法则返回一个对象的代理,延迟加载直到真正...

    基于Java的数据库应用框架的研究设计

    在Java数据库应用框架方面,Java作为一种流行的编程语言,拥有丰富的数据库连接和支持库,如JDBC(Java Database Connectivity),它是Java访问数据库的标准API。通过JDBC,开发者可以编写数据库独立的代码,实现对...

    Hibernate学习心得

    在Hibernate中,我们需要创建一个`hibernate.cfg.xml`配置文件来设置数据库连接信息,以及`hibernate.hbm.xml`或使用注解的方式来定义对象与数据库表的映射关系。实体类通常包含属性,这些属性对应于数据库表的列,...

    hibernate-3.2.7.ga.zip

    1. **对象关系映射(ORM)**:Hibernate允许开发者用面向对象的方式来处理数据库操作,通过映射Java类到数据库表,实现了对象和关系数据库之间的桥梁。 2. **自动SQL生成**:根据对象模型,Hibernate可以自动生成...

    hibernate-3.2源码包

    9. **第二级缓存(Second-Level Cache)**:Hibernate 支持二级缓存,能提高数据访问速度,减少对数据库的直接访问。常用实现有Ehcache。 10. **懒加载(Lazy Loading)**:Hibernate 提供的一种优化策略,允许关联...

    hibernate jar包+api

    ORM将数据库表映射为Java类,使得数据库操作可以通过对象的方式来实现,降低了数据库访问的复杂性。这使得开发者可以专注于业务逻辑,而不是底层的数据访问代码。 **Hibernate jar包** 在“hibernatejar”这个文件...

Global site tag (gtag.js) - Google Analytics