问题:
在做Hibernate查询的时候,对于一对多的查询效率有很大的疑问。比如说“班级”表,和“学生”表,当获得班级表的时候,Hibernate将获得所有的学生记录(Lazy=false)。可能有的朋友会说设置lazy=true,使用延迟加载来分散工作强度。但这在我的例子里不适用。
延迟加载是当你需要的时候加载子类(子表),在我的程序里,查询到“班级”表之后,我需要把这个类转化成另一个结构相同但package不同的类(做GWT时服务器端的代码在客户端不能识别,所以要进行转化)。由于一个类里有很多子类,而子类还包含别的子类,所以手动转化很困难。我用一个第三方的工具进行转化,这个工具会对里面所有的属性遍历,这样的话即便在Hibernate里设置了延迟加载,转化的时候还是会查找获得所有的子类信息。
这样的话,只要有几个表里有几百条记录就会影响到查询速度。而且更严重的是在GWT里用RPC从服务器端获取类的时候,如果这个类所包含的数据量太大,当从服务器向客户传输的时候,所形成的JSON字符串就特别大,有时候甚至会导致服务器死机。
解答:
延迟加载是罪魁祸首,所谓“成也萧何,败也萧何”。
有时发现查询速度很慢,检查才发现是我没有启用延迟加载,造成递归的数据都被加载进来了。
如果加上了延迟加载,那么许多页面将无法使用,必须在程序里进行代码级别的递归的延迟加载数据的读取。
1 用hql来写查询语句,这是最高效的办法(推荐)
2 用jdbc,脱离了hibernate范畴,缓存方面和乐观所方面会出现不一致,而且语句变得繁琐了(不推荐)
3 将前台要用到的实体,独立设计成单独的类,没有任何关联,都是单表,用到的只是hibernate的封装以及简单的or映射
4 在大数据量系统中都会遇到类似的问题,我的解决方法是少用一对多关联映射或者不用一对多关联,设置关联少的数据表,用SQL语句做关联的查询,hibernate中映射的配置
lazy都为false
分享到:
相关推荐
hibernate中一对多和多对一的配置区别
Hibernate映射一对多关联关系
Hibernate多对多关联添加及查询示例
NULL 博文链接:https://gaoquanyang.iteye.com/blog/1213765
hibernate多表联合查询实例,很经典的查询语句和总结.
Hibernate连表查询 Hibernate连表查询
基于Hibernate的查询效率的探讨,张文英,安伟莲,本文首先介绍了Hibernate的原理及查询机制,然后从制定合理的缓存策略和应用延迟加载两方面来提高Hibernate的查询效率。
Hibernate 多表连接分页查询示范项目 Hibernate Criteria 多表连接 分页
hibernate多对多关系映射案例,配有对应的jar包。
hibernate 多表查询 hibernate 多表不同于一般的sql嵌套查询,嵌套查询是不支持的,所以必须要配置好才能实现多表!只要配置好了,还是特别好用的
hibernate效率注意的几个问题,批量删除和批量更新建议用JDBC,这是一个原则,当然有的时候可能必须用Hibernate来批量更新和批量删除,那么这个时候我想说的就是,Hibernate批量更新和删除效率并非传说中的那么差,...
hibernate基于主外键的一对多/多对一关联
Hibernate一对一,一对多,多对多实例
NULL 博文链接:https://1028826685.iteye.com/blog/1536060
hibernate一对多案例,里边用到的jar包我上传过
hibernate多对多关联的问题 详细介绍
hibernate一对多映射源代码 希望大家可以顶一下。。
hibernate 一对多和多对一的理解 自己的个人看法 大家也来看看
Hibernate关于注解的一对多,多对多,一对一案例。。。。
详尽说明了hibernate的多对多原理。