请问hibernate 如何优化sqlserver2000的分页。

问题描述

我用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));}}
解决方案:
没什么效果,同之前一样,还是查询出所有的..慢.

时间: 2024-10-23 03:08:21

请问hibernate 如何优化sqlserver2000的分页。的相关文章

【HIBERNATE框架开发之九】HIBERNATE 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/825.html 1.   循环分页或者循环进行部分读取处理数据的时候,使用 session.clear() ;   2.    对应1+N(N+1)问题使用如下解决方式: 1): 使用createCriteria进行查询(join fetch) 2):HQL -> join fetch 3): 使用@fetch设置LAZ

Hibernate学习之------&amp;gt;Hibernate性能优化的几点建议

1.针对oracle数据库而言,Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,一般设置为30.50.100.Oracle数据库的JDBC驱动默认的Fetch Size=15,设置Fetch Size设置为:30.50,性能会有明显提升,如果继续增大,超出100,性能提升不明显,反而会消耗内存. 即在hibernate配制文件中进行配制: 1 <property name="hibernateProperties"> 2

hibernate 的 DetachedCriteria 如何进行分页?

问题描述 hibernate 的 DetachedCriteria 如何进行分页? 如果使用getCurrentSession和criteria可以这样进行分页,限制结果集: Session session=getHibernateTemplate().getSessionFactory().getCurrentSession(); Criteria criteria=session.createCriteria(User.class); List list=criteria.setFirstR

请问这个连接怎么爬取分页数据,找不到连接

问题描述 请问这个连接怎么爬取分页数据,找不到连接 这个地址要在ie下浏览才能好用,想用爬虫爬取出最近的数据,但是分页那部分好像已经封装了,请明白人帮忙看看,怎么个思路.http://www.ccgp-liaoning.gov.cn/bulletininfo.do?method=bdetail 解决方案 从请求中可以看到这个参数bulletininfotable_p=1就是分页的

Hibernate 性能优化法则

Hibernate 是 Java EE 应用中流行的 JPA 框架,简单易用,但很多使用过 Hibernate 的开发者都普遍反映 Hibernate 性能低下.究其原因,还是使用者没有对 Hibernate 进行过深入理解,对 Hibernate 的应用也只是浮于表面.本文介绍了几种简单实现 Hibernate 性能优化的方法. 启用 Hibernate 数据统计策略 没有测量就没有优化.启用 Hibernate 数据统计策略,用来做优化前后的数据对比. 将 hibernate.generat

请问hibernate更新删除优化问题

问题描述 如果用hibernate自己的update()方法,那么更新时会先查对象,在进行更新,也就是产生两条sql语句,如果我用SQLQUERY执行(updatetablesetx=xwhereid=x)这样的话一句语句就可以搞定,性能上应该有所提高吧?请问是第一种用update()方法好还是第二种自己写sql语句好? 解决方案 解决方案二:用hibernate的吧,你的优化不是很明显,并且也没有事务处理等其他必要的要求.解决方案三:数据库就好比是个"老外";hibernate既是&

搜索引擎优化的内容分页的优点和缺点(一)

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 分页是一块内容分成不同的页面的做法,严重影响用户体验,Web开发和 搜索引擎优化 ,它是常用的导航技术.这篇文章是SEO分页的第一部分,我们将讨论最常见的类型,大家可以在网上找到我们所列出的好处和副作用. 在Web上的分页用途 最常见的分页,你可以找到在网络上的用途是: 分页列表:使用这种类型的分页,当我们分割成几页的大名单.这是一种很常见的

SQL优化:limit分页优化

分页查询 分页查询的问题点主要集中在 如何快速定位起始点 减少无用数据缓存 mysql为分页查询提供了很方便的关键字limit,但这个关键字在数据量较大时,却很低效. "limit m,n"关键字的意思是,从第m行开始,扫描满足条件的n个偏移行.若需从第1行开始,则不需要指定m值. 示例 表aaaaa中共有2375690数据. 优化前的SQL SQL执行结果: SELECT DISTINCT(device_id) uid FROM aaaaa WHERE status = 0 LIMI

请问,hibernate 与oracle 11g 链接的配置这样写哪里有问题?

问题描述 这是我的配置文件:<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.url">jdbc:oracle:t