6、 方法选用
a)完成同样一件事,HIBERNATE提供了可供选择的一些方式,但具体使用什么方式,可能用性能/代码都会有影响。显示,一次返回
十万条记录(List/Set/Bag/Map等)进行处理,很可能导致内存不够的问题,而如果用基于游标(ScrollableResults)或Iterator
的结果集,则不存在这样的问题。
b)Session的load/get方法,前者会使用二级缓存,而后者则不使用。
c)Query和list/iterator,
如果去仔细研究一下它们,你可能会发现很多有意思的情况,
二者主要区别(如果使用了Spring,在HibernateTemplate中对应find,iterator方法):
i.list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但list查出的对象会写入二级缓存,但它一般只生成较少的执行SQL语句,很多情况就是一条(无关联)。
ii. iterator则可以利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如果缓存中没有任何符合条件的记录,使用iterator会产生N+1条SQL语句(N为符合条件的记录数)
iii. 如:while(it.hasNext()){YouObject object = (YouObject)it.next();session.evit(youObject);sessionFactory.evice(YouObject.class, youObject.getId());}如果用list方法,很可能就出OutofMemory错
误了 iv. 通过上面的说明,我想你应该知道如何去使用这两个方法了。
7、 集合的选用
在HIBERNATE 3.1文档的“19.5. Understanding Collection performance”中有详细的说明。
8、 事务控制
事务方面对性能有影响的主要包括:事务方式的选用,事务隔离级别以及锁的选用
a)事务方式选用:如果不涉及多个事务管理器事务的话,不需要使用JTA,只有JDBC的事务控制就可以。
b)事务隔离级别:参见标准的SQL事务隔离级别
c)锁的选用:
悲观锁(一般由具体的事务管理器实现),对于长事务效率低,但安全。
乐观锁(一般在应用级别实现),如在HIBERNATE中可以定义VERSION字段,显然,
如果有多个应用操作数据,且这些应用不是用同一种乐观锁机制,则乐观锁会失效。
因此,针对不同的数据应有不同的策略,同前面许多情况一样,很多时候我们是在效率与安全/准确性上找一个平衡点,
无论如何,优化都不是一个纯技术的问题,你应该对你的应用和业务特征有足够的了解。
9、 批量操作
即使是使用JDBC,在进行大批数据更新时,BATCH与不使用BATCH有效率上也有很大的差别。
我们可以通过设置batch_size来让其支持批量操作。举个例子,要批量删除某表中的对象,
如“delete Account”,打出来的语句,会发现HIBERNATE找出了所有ACCOUNT的ID,
再进行删除,这主要是为了维护二级缓存,这样效率肯定高不了,在后续的版本中增加了
bulk delete/update,但这也无法解决缓存的维护问题。也就是说,由于有了二级缓存的
维护问题,HIBERNATE的批量操作效率并不尽如人意!
从前面许多要点可以看出,很多时候我们是在效率与安全/准确性上找一个平衡点,无论如何,
架构风险是应该在初期意识到并制定好相关的对策。还有一点要注意,应用层的缓存只是锦上添花,
永远不要把它当救命稻草,应用的根基(数据库设计,算法,高效的操作语句,恰当API的选择等)
才是最重要的。
分享到:
相关推荐
这个"框架SSH_1整合开发struts1+spring+hernate"的主题主要关注这三个框架如何协同工作,构建出高效、稳定的Web应用程序。 **Struts 1** 是一个MVC(Model-View-Controller)架构的Java框架,它为开发者提供了处理...
在IT行业中,构建高效、可维护的Web应用是开发者的核心任务之一。...在实际开发过程中,可以根据项目需求进行调整和优化,比如引入MyBatis作为替代Hibernate的选择,或者使用Spring Boot简化配置等。
在实际应用中,可以根据项目需求进行扩展,例如添加缓存策略、优化性能等。 为了更好地理解这一通用方法,你可以查看提供的"pager"压缩包文件,它可能包含了实现分页功能的相关类和配置文件,如Struts的Action、...
**正文** 在IT行业中,尤其是Java Web开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式处理数据。本篇文章将详细讲解如何使用Hibernate3在...
【S2SH注解 + Maven 小例子】是一个典型的Java Web开发示例,它整合了Struts2、Spring和Hibernate三大框架,并利用注解进行配置简化。在这个项目中,Maven作为构建工具,Log4j用于日志管理,MySQL则是后台数据库。...