锁定老帖子 主题:看看这2种方法哪个速度更快。
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2005-02-18
public class BbsMainDaoImp extends HibernateDaoSupport implements IBbsMainDao { private Integer totalCount = new Integer(0);; .................. //得到某主题及其回复列表 public List findBbsBack2(String mainId); throws DataAccessException{ String hql = " from org.erp.po.BbsMain bbsMain where bbsMain.mainId = ? or bbsMain.bbsMain.mainId=?"; final Object[] parms = new Object[]{mainId,mainId}; final Type[] types = new Type[]{Hibernate.STRING,Hibernate.STRING}; try { return getHibernateTemplate();.find(hql, parms,types);; } catch (DataAccessException ex); { logger.error(ex);; return new ArrayList();; } } public List findBbsBack1(String mainId, int pageNum, int pageSize); throws DataAccessException{ List list=null; Query query=null; Session session = getSession();; try{ //查询这个主题和它的回复,返回一个list String hql = " from org.erp.po.BbsMain bbsMain where bbsMain.mainId = ? or bbsMain.bbsMain.mainId=?"; //得到当前页的一个list集合 query = getHibernateTemplate();.createQuery(session, hql);; query.setParameter(0, mainId, Hibernate.STRING);; query.setParameter(1, mainId, Hibernate.STRING);; if ( (pageSize != -1); && (pageNum != -1);); { query.setMaxResults(pageSize);; query.setFirstResult(pageNum);; } list = query.list();; }catch(HibernateException ex);{ throw SessionFactoryUtils.convertHibernateAccessException(ex);; } finally{ if (session!=null);{ try { session.close();; }catch(HibernateException ex);{ throw SessionFactoryUtils.convertHibernateAccessException(ex);; } } } return list; } } findBbsBack1重新写了getHibernateTemplate().find(...) 我想请问 findBbsBack1的 if ( (pageSize != -1); && (pageNum != -1);); { query.setMaxResults(pageSize);; query.setFirstResult(pageNum);; } 对于提高速度是否有帮助 ? 因为涉及到分页.我只会用 findBbsBack1这种方式. 我感觉写起来有点乱.不如findBbsBack2 方便. 但 用 findBbsBack2有2个疑问: 1: 在速度上是不是 很浪费, 因为 我 只 显示 当前页数据, 它 好像是都取出来了. 2: 对于用findBbsBack2 可以实现分页么? 我没 看过 这方面的代码.不知道 怎么写 . 谢谢. 而对于 findBbsBack1 我想得到 所有记录的总数还要 这样 读一次: private static final String MainBacks = " from org.erp.po.BbsMain bbsMain where bbsMain.mainId = ? or bbsMain.bbsMain.mainId=?"; private static final String countStr = "select count(*);"; query = getHibernateTemplate();.createQuery(session, countStr + MainBacks);; query.setParameter(0, mainId, Hibernate.STRING);; query.setParameter(1, mainId, Hibernate.STRING);; if(!query.list();.isEmpty(););{ this.totalCount = (Integer); query.list();.get(0);; } 真不知道 哪个方式好 . 请教 大家 ![]() 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-02-18
就多读一次又何妨,Dao写2个方法
提供分页方法就用findBbsBack1 public List findBbsBack1(String mainId, int pageNum, int pageSize) throws DataAccessException; 取得总数 public int getTotalCount(); |
|
返回顶楼 | |
发表时间:2005-02-19
紧急下潜 写道 就多读一次又何妨,Dao写2个方法
提供分页方法就用findBbsBack1 public List findBbsBack1(String mainId, int pageNum, int pageSize) throws DataAccessException; 取得总数 public int getTotalCount(); 为什么你 回答我的问题,我总感觉你没看完我的提问呢。 都 没答到点子上, 比如 这个问题, 你不过重复了一下我的 问题。 根本 没 听你什么 有 价值的 建议 。 请原谅 我 这么说, 以前你回答我的问题也是 。 好像 总是答非所问。 |
|
返回顶楼 | |
发表时间:2005-02-19
当然是用数据库分页好了..
假如数据库数据有几十万条或者更多,那效率就很明显了.. public List findAgents(String agentName, String agentNo, final PagingAndSorting pas); { String sql = "from AgentInformation a where 1=1 "; if (StringUtils.isNotEmpty(agentName);); { sql = sql + " and a.aiAgentName like '%" + agentName + "%' "; } if (StringUtils.isNotEmpty(agentNo);); { sql = sql + " and a.aiNo = '" + agentNo + "' "; } final String sqlin = sql; return getHibernateTemplate();.executeFind(new HibernateCallback(); { public Object doInHibernate(Session s); throws HibernateException, SQLException { List agents = null; //得到记录总数 int count = ((Integer); s.iterate("select count(*); " + sqlin);.next(); );.intValue();; pas.setItemCount(count);; //排序查询。 pas.setAlias("a");; String sqlOrder = sqlin + DaoUtils.buildOrderBy(pas);; Query query = s.createQuery(sqlOrder);; // 设定数据范围 if (pas != null && !pas.isAll();); { query.setFirstResult(pas.getFirstResult(););; query.setMaxResults(pas.getMaxResults(););; } return query.list();; } });; } |
|
返回顶楼 | |
发表时间:2005-02-20
引用 当然是用数据库分页好了..
假如数据库数据有几十万条或者更多,那效率就很明显了.. 但是我刚刚看了一个教程关于hibernate 用list还是Iterator的问题。里面涉及了JCS . 大概是说如果用 了JCS 那么Iterator的话, 在 第一次从数据库中取出来后,以后 就 不用再在数据库中取了。 我理解是: 比如 有 100条记录, 如果不用分页 那么 Iterator 的话,第一次可能慢 取了100(一个疑问如果100万条呢,一次最多取多少条,好像100条一次应该没问题都能取走 oracle) 条, 然后 呢,每页显示10条。 第一页 显示 10。翻下一页, 显示 10-20条,那这些记录 就 不是从数据库取的是从JCS 中取得。那速度应该很快,。。。。 而反观 那种分页的。 它第一次 取 10条记录, 即使用了Iterator 那 它也只 保存了10条在JCS里 。 当 第二页时候还要去数据库取。 我感觉,就是在后面页 的数据显示方面,分页读取方式 都将处于劣势。 如果这样成立的话。那 设置 分页查询 反倒是慢了。 不知道对不对。 希望大家各抒己见。谢谢。 |
|
返回顶楼 | |
发表时间:2005-02-21
JCS?什么时候的东东拉?现在早改ehcache拉。
robbin好像有篇文章详细分析吧,找找看。 |
|
返回顶楼 | |
发表时间:2005-02-21
我觉得2实现起来本身就是个问题,先不看效率。
|
|
返回顶楼 | |
发表时间:2005-02-21
http://blog.csdn.net/rosen/archive/2005/01/26/269612.aspx
楼上说得ehcache |
|
返回顶楼 | |
发表时间:2005-02-21
差沙 写道 我觉得2实现起来本身就是个问题,先不看效率。
可是我运行是出效果的。什么问题啊 ? |
|
返回顶楼 | |
发表时间:2005-02-21
我也想知道hibernate里怎么分页,我现在的系统采用的sql分页,速度还比较快,不知道hibernate里面怎么处理这个问题?
|
|
返回顶楼 | |