日期:2014-05-16 浏览次数:20658 次
今天下班后,回家的路上,在思考网站的优化问题。
这个问题几年以来一直存在,但是都没找到解决方法,曾经也许找过,但是未果。
?
存在问题:首页、列表等页面,取出的list,存在大量的冗余数据。
我用代码举例说明一下,例如列表页取出某个产品的list,HQL代码如下:
String hql = "from Product p where p.valid=:valid order by.......";
?这段代码返回的list<Product>中,list的每一条,都会保存Product对象的所有的内容。
?
?然而,列表页真正需要用到的,只有name(产品名称),id(数据的id),image(图片路径),publishTime(发布时间)……等等很少量的数据。像一些诸如产品规格、详细描述字段存储的内容,其实是用不到的。
?但是用不到,却取出来了,并且保存在返回的list里,于是就会增加不必要的内存开销,增加服务器的压力。
?
那么有什么办法能让list<Product>中的每一条数据,仅仅取出需要用到的呢?答案当然是有的,今天百度了一下,找到如下的解决方案:
?
?举一反三,解决方案有了,呵呵。
?
String hql = "select new Product(p.id, p.name, p.image) from Product p where p.valid=:valid order by.......";
?
这样查询出来的是Product对象,而不是Object[]对象,结果比较满意。
?
?解决方法是在回家后找到的,因此还没应用到项目中,明天上班测试一下,会把结果发上来。
?
?PS:如果真的可行,那服务器得多么的感谢我呀,哈......
===========================昨日(2012年3月30日)的分割线=======================
?
今天到公司就开始改代码,把HQL语句改成上面类似的,之后运行测试,结果报错......异常信息如下
?
org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate constructor on class.....
?
?去网上搜了一下,原来还得添加构造方法……构造方法如下:
?
?
public Product(){ /*这是空的构造方法,你不填写别的构造方法,这个可以不写,但是一旦有了别的 * 构造方法,这个就必须得跟上了...... */ } public Product(Long id, String name, String image){ this.id = id; this.name = name; this.image = image; }
? 这里有一个地方要注意一下:HQL里new Product之后的参数顺序,一定要和构造方法里的参数顺序保持一致!
? 添加好构造方法,编译、运行测试,结果通过了,ok搞定!
?
? 补充一句,如下的代码写法也是可以的,只要对象正确就ok:
String hql = "select new Product(id, name, image) from Product p where p.valid=:valid order by.......";
?
? 至此,本文基本就结束了。小小的解决了hibernate不如ibatis的一大缺点,呵呵。
?
?
? 以上做法能为服务器节省很大的内存,不过编码实在是麻烦,有没有更好的,比较智能的方式呢?继续寻找ing.....哪位大侠有好的方法,千万别吝啬,分享一下,大家都进步,社会才进步么,呵呵。希望不吝赐教!
?