Hibernate3.2 中使用视图优化HQL
这次在优化系统中,由于客户使用的SQL server 2005的标准版,此版本不支持分区功能,但如果不分区,系统优化的效果就不会很明显。后来使用了分区视图。
在系统中,没有使用对象关联,发现很多地方为查询信息,多次读取数据库。后来也用视图进行封装。
本文就讨论在Hibernate3.2如何配合使用数据库视图技术。
1, 使用分区视图
2, 使用视图
以上两中视图,是我这次在Hibernate中优化的视图方式,下面来分别介绍这两个类型视图的使用,以及为何要使用他们
1,使用分区视图
这时系统客户采用的是SQL server 2005 的标准版,sql 2005企业版只有分区功能,其他版本不可能有。但客户是购买的是正版,要他们使用D版,他们就是不同意,说是大公司,查出来很麻烦。不能用盗版。但分析数据库的慢SQL语句,这时如果不使用分区功能,其有时全表扫描是不可避免的,唯一有减少大表行数,才好优化慢SQL。
这时我们只有使用分区视图,按照一定的规则,将几个大的表拆分出来。
在hibernate中表和视图是分开使用的,原有的配置文件不做任何改变就可以使用,同事为了使用分区功能,在程序使用是增加一个标志位来实现”分区消除“功能,减少扫描的数据量,结果数据性能大大提高。
注意:1,新增加数据时必须设定其标志位,保证其插入的数据库的一张表中。不然会报错
2,分区视图内的表字段和类型(包括长度)必须一致,要符合分区视图的条件
2,使用一般视图
这次在优化系统中,原有的配置文件,都没配对象关联,都是只对一个表配一个hbm文件,这时在系统里,为了取一个字段数据,要关联多张表时,这时就在多次读取数据库,有时是在循环里读取。还由于有时是left join,在HQL里,不在hbm文件配置对象关联是不能使用left join的。
循环数据量小点还可以,一旦数据量多了,就很慢。
这时就将需要的HQL语句转换成sql语句,将这个sql语句封装成视图,提供一下必要的查询接口,前台查询时就只查询这个视图,这个视图不在以来Hbm文件的配置文件和延迟加载等待问题了。
这样一来,以前的有些多次读取数据库的情况就解决了。在添加适当的索引,速度很快就出来了。
注意:这实际做的过程中,设定的id主键时,由于当时没考虑到hibernate的id唯一,造成了出来多条不同记录,但显示却是重复的记录,因为id一样,这时的hashCode是一致的。hibernate就直接去取了内存的数据,这时设定的id值在视图处理时要保证id主键值的唯一,重写hashCode值的生成机制,我当时处理是将多个字段组合成唯一字段,实际这个字段不需要使用和没有意义的。
以上是我在优化系统中,碰到的问题和解决办法,欢迎和大家交流!