问题描述
我用hibernate连接sqlserver2000,用它自带的方言,我发现他的分页居然是假分页,它是直接把符合条件的记录全查出来,再从中显示若干条出来。这样我觉得应该会影响效率,有没有人做过这方面的优化,听说一定要用存储过程,不知道该如何结合起来使用,最好就是能重写它的方言,这方面在网上搜了一下,大都是针对sqlserver2005,不知道sqlserver2000要怎么处理。
解决方案
解决方案二:
假分页?我觉得应该还是真分页吧,你把你的代码和发出的SQL看看呢,我想Hibernate还没做得这么垃圾,关于性能的优化,可以对数据库相应字段建立索引或采取一些数据优化措施抛开你这个话题,如果你数据库的数据不是很多话,很多时候假分页的对系统性能的影响或许还要小于真分页的,频繁的读取数据库也会造成资源连接资源的浪费,而连接资源往往也是很重要的
解决方案三:
1楼说的有点道理。假分页应该不可能吧?否则上几十万的不就不能用hib了吗?另外,不一定要存储过程啊,你可以用sql。hib支持原始sql的
解决方案四:
sql2000就是2个top实现的,没有法子,他自身没有好的分页机制
解决方案五:
你看下语句数据应该不是假分页(看下HIBERNATE的源码都是SQL)至于重写方言..我帮你找找..
解决方案六:
引用4楼bearkin的回复:
你看下语句数据应该不是假分页(看下HIBERNATE的源码都是SQL)至于重写方言..我帮你找找..
非常感谢你。
解决方案七:
引用1楼myxx520的回复:
假分页?我觉得应该还是真分页吧,你把你的代码和发出的SQL看看呢,我想Hibernate还没做得这么垃圾,关于性能的优化,可以对数据库相应字段建立索引或采取一些数据优化措施抛开你这个话题,如果你数据库的数据不是很多话,很多时候假分页的对系统性能的影响或许还要小于真分页的,频繁的读取数据库也会造成资源连接资源的浪费,而连接资源往往也是很重要的
关于它生成的语句,我发大家看下:selecttop2data_shopp0_.ProductIDasProductID3_,data_shopp0_.ProductNameasProductN2_3_,data_shopp0_.TypeIDasTypeID3_,data_shopp0_.PriceasPrice3_,data_shopp0_.PointTypeasPointType3_,data_shopp0_.PointasPoint3_,data_shopp0_.ProductDescriptionasProductD7_3_,data_shopp0_.PictureasPicture3_,data_shopp0_.NewTagasNewTag3_,data_shopp0_.HotTagasHotTag3_,data_shopp0_.GoodTagasGoodTag3_,data_shopp0_.TypeNameasTypeName3_,data_shopp0_.ProductTypeasProduct13_3_fromBC_DB.dbo.SHOP_Productdata_shopp0_wheredata_shopp0_.NewTag=1如果我是1000条,它会top1000.那这样是全部查出来了吧
解决方案八:
sqlserver没有分页,使用存储过程吧
解决方案:
引用5楼lwjshuai的回复:
引用4楼bearkin的回复:你看下语句数据应该不是假分页(看下HIBERNATE的源码都是SQL)至于重写方言..我帮你找找..非常感谢你。
是假分页不过他是先用TOP查询然后才用ResultSet搞的..
解决方案:
解决方案:
引用8楼bearkin的回复:
引用5楼lwjshuai的回复:引用4楼bearkin的回复:你看下语句数据应该不是假分页(看下HIBERNATE的源码都是SQL)至于重写方言..我帮你找找..非常感谢你。是假分页不过他是先用TOP查询然后才用ResultSet搞的..
解决方案:
这是我长用的分页方法,应该和你的一样吧。。。publicList<Object>executeSql(ClassobjClass,Stringsql,intpageNo,intpageSize)throwsException{//TODOAuto-generatedmethodstubList<Object>list=null;Transactiontrans=null;Queryquery=null;intstart=(pageNo-1)*pageSize;Sessionsession=HibernateSessionFactory.getSession();trans=session.beginTransaction();query=session.createSQLQuery(sql).addEntity(objClass);query.setFirstResult(start);query.setMaxResults(pageSize);query.setCacheable(true);list=query.list();trans.commit();HibernateSessionFactory.closeSession();returnlist;}
解决方案:
引用6楼lwjshuai的回复:
引用1楼myxx520的回复:假分页?我觉得应该还是真分页吧,你把你的代码和发出的SQL看看呢,我想Hibernate还没做得这么垃圾,关于性能的优化,可以对数据库相应字段建立索引或采取一些数据优化措施抛开你这个话题,如果你数据库的数据不是很多话,很多时候假分页的对系统性能的影响或许还要小于真分页的,频繁的读取数据库也会造成资源连接资源的浪费,而连接资源往往也是很重要的关于它生成的语句,我发大家看下:selecttop2data_shopp0_.ProductIDasProductID3_,data_shopp0_.ProductNameasProductN2_3_,data_shopp0_.TypeIDasTypeID3_,data_shopp0_.PriceasPrice3_,data_shopp0_.PointTypeasPointType3_,data_shopp0_.PointasPoint3_,data_shopp0_.ProductDescriptionasProductD7_3_,data_shopp0_.PictureasPicture3_,data_shopp0_.NewTagasNewTag3_,data_shopp0_.HotTagasHotTag3_,data_shopp0_.GoodTagasGoodTag3_,data_shopp0_.TypeNameasTypeName3_,data_shopp0_.ProductTypeasProduct13_3_fromBC_DB.dbo.SHOP_Productdata_shopp0_wheredata_shopp0_.NewTag=1如果我是1000条,它会top1000.那这样是全部查出来了吧
你分页的时候不会一页1000条数据的嘛,你拿多少就top多少三
解决方案:
觉得hibernate的分页不太好用LZ看下HIBERNATE的源码不就清楚了么
解决方案:
引用11楼myxx520的回复:
这是我长用的分页方法,应该和你的一样吧。。。JavacodepublicList<Object>executeSql(ClassobjClass,Stringsql,intpageNo,intpageSize)throwsException{//TODOAuto-generatedmethodstubList<Object>list=null;Transactiontrans=null;Queryquery=null;intstart=(pageNo-1)*pageSize;Sessionsession=HibernateSessionFactory.getSession();trans=session.beginTransaction();query=session.createSQLQuery(sql).addEntity(objClass);query.setFirstResult(start);query.setMaxResults(pageSize);query.setCacheable(true);list=query.list();trans.commit();HibernateSessionFactory.closeSession();returnlist;}
恩。差不多,我想请教下query.setCacheable(true);这句的作用是?缓存,它主要用在什么情况下。
解决方案:
当开启了二级缓存后,比如使用encache,会将查询的对象放到内存中,第二次查询的时候根据持久化对象的标识从内存中去获取该对象
解决方案:
问:为什么findAll方法报异常?我的其他这个地方也是用这个的,怎么没事啊?急主键是专业编号,自己添加。@SuppressWarnings("unchecked")publicList<Zhuanye>findAll(){log.debug("findingallZhuanyeinstances");List<Zhuanye>list2=null;try{StringqueryString="fromZhuanye";QueryqueryObject=HibernateSessionFactory.getSession().createQuery(queryString);list2=queryObject.list();returnlist2;}catch(RuntimeExceptionre){log.error("findallfailed",re);throwre;}}
解决方案:
2005之所以支持是因为2005加了一个函数而2000没有相当年我第一次用的数据库就是MSSQL分页这里当时我很难找到一条好的分页语句而现在...
解决方案:
引用16楼swjtu_li的回复:
问:为什么findAll方法报异常?我的其他这个地方也是用这个的,怎么没事啊?急主键是专业编号,自己添加。@SuppressWarnings("unchecked")publicList<Zhuanye>findAll(){log.debug("findingallZhuanyeinstances");List<Zhuanye>list2=null;try{StringqueryString="fromZhuanye";QueryqueryObject=HibernateSessionFactory.getSession().createQuery(queryString);list2=queryObject.list();returnlist2;}catch(RuntimeExceptionre){log.error("findallfailed",re);throwre;}}
Whereistheexception?
解决方案:
引用楼主lwjshuai的回复:
我用hibernate连接sqlserver2000,用它自带的方言,我发现他的分页居然是假分页,它是直接把符合条件的记录全查出来,再从中显示若干条出来。这样我觉得应该会影响效率,有没有人做过这方面的优化,听说一定要用存储过程,不知道该如何结合起来使用,最好就是能重写它的方言,这方面在网上搜了一下,大都是针对sqlserver2005,不知道sqlserver2000要怎么处理。
假分页影响效率???楼主你想真分页呢?能用的假分页优先使用。。。。使缓存达到最大化利用。。。。。(除非像股市、金融等行业。。)越高级别的缓存越有用。(比如SessionFactory的缓存。)
解决方案:
"这年头有假的谁还用真的呀"同样适合编程。。。
解决方案:
引用12楼myxx520的回复:
引用6楼lwjshuai的回复:引用1楼myxx520的回复:假分页?我觉得应该还是真分页吧,你把你的代码和发出的SQL看看呢,我想Hibernate还没做得这么垃圾,关于性能的优化,可以对数据库相应字段建立索引或采取一些数据优化措施抛开你这个话题,如果你数据库的数据不是很多话,很多时候假分页的对系统性能的影响或许还要小于真分页的,频繁的读取数据库也会造成资源连接资源的浪费,而连接资源往往也是很重要的关于它生成的语句,我发大家看下:selecttop2data_shopp0_.ProductIDasProductID3_,data_shopp0_.ProductNameasProductN2_3_,data_shopp0_.TypeIDasTypeID3_,data_shopp0_.PriceasPrice3_,data_shopp0_.PointTypeasPointType3_,data_shopp0_.PointasPoint3_,data_shopp0_.ProductDescriptionasProductD7_3_,data_shopp0_.PictureasPicture3_,data_shopp0_.NewTagasNewTag3_,data_shopp0_.HotTagasHotTag3_,data_shopp0_.GoodTagasGoodTag3_,data_shopp0_.TypeNameasTypeName3_,data_shopp0_.ProductTypeasProduct13_3_fromBC_DB.dbo.SHOP_Productdata_shopp0_wheredata_shopp0_.NewTag=1如果我是1000条,它会top1000.那这样是全部查出来了吧你分页的时候不会一页1000条数据的嘛,你拿多少就top多少三
不是的,如果第页三条,第二页它就top6,第三页就top9
解决方案:
不知楼主找到好的解决方法了吗,我也在寻找解决此问题的方案?
解决方案:
楼主威武..
解决方案:
packagecom.cat.xtools.data;importoracle.net.ano.SupervisorService;importorg.hibernate.dialect.SQLServerDialect;/***实现MsSql的limit*@authorAdministrator**/publicclassMsSqlDialectextendsSQLServerDialect{publicMsSqlDialect(){super();//TODOAuto-generatedconstructorstub}publicStringgetLimitString(Stringsql,intoffset,intlimit){if(offset==0){returnsuper.getLimitString(sql,0,limit);}StringsqlTemp=super.getLimitString(sql,0,limit);if(offset==limit)returnsqlTemp;//DAOImpl.Stringorderby=this.getOrderby(sql);if(orderby.equals("")){sqlTemp=super.getLimitString("select*from("+sqlTemp+")cat_sql_temp_000",0,limit-offset+1);}else{sqlTemp=super.getLimitString("select*from("+sqlTemp+")cat_sql_temp_000orderby"+orderby,0,limit-offset+1);}returnsqlTemp;}//得到反转的orderbyprivatestaticStringgetOrderby(Stringsql){Stringorderby="";intlastk=sql.lastIndexOf(")");intlasto=sql.toLowerCase().lastIndexOf("orderby");if((lastk>lasto&&lastk>-1)||lastk==lasto){return"";}orderby=sql.substring(lasto+8,sql.length());String[]os=orderby.split(",");Stringnob="";for(inti=0;i<os.length;i++){intdian=os[i].indexOf(".");if(dian>-1){os[i]=os[i].substring(dian+1,os[i].length());}String[]colums=os[i].trim().split("");Stringcm=colums[0];intas=0;as=sql.indexOf(""+colums[0]+"as");if(as<0){as=sql.indexOf(","+colums[0]+"as");}if(as<0){as=sql.indexOf("."+colums[0]+"as");}if(as>-1)//当内sql有as时{as=as+("."+colums[0]+"as").length();intend=sql.indexOf("",as);if(end<0||(end>(sql.indexOf(",",as))&&sql.indexOf(",",as)>-1)){end=sql.indexOf(",",as);}if(end>-1){cm=sql.substring(as,end);//System.out.println(as+":"+end);}}if(colums.length<2){nob+=","+cm+"desc";}elseif(colums[1].toLowerCase().equals("asc")){nob+=","+cm+"desc";}else{nob+=","+cm+"asc";}}if(nob.length()>0){nob=nob.substring(1,nob.length());}//System.out.println("=============="+sql+":"+nob+"=================");returnnob;}/***@paramargs*/publicstaticvoidmain(String[]args){//System.out.println(getOrderby("selectcc.idasidd,cc.labelfromccorderbyidasc"));//System.out.println("selectcc.idasidd,cc.labelfromccorderbyidasc".indexOf(",",16));//TODOAuto-generatedmethodstubMsSqlDialectd=newMsSqlDialect();System.out.println(d.getLimitString("SELECT*FROMHtmlLabelIndex",1,1));}}
解决方案:
没什么效果,同之前一样,还是查询出所有的..慢.