论坛首页 Java企业应用论坛

看看这2种方法哪个速度更快。

浏览 9060 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-02-18  
我论坛主题和回复放在一个表里BbsMain  (hibernate了)现在我 写了一个Dao。它的实现 是这样。其中findBbsBack1和findBbsBack2实现相同功能.读出list
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);;
			}



真不知道 哪个方式好 .  请教 大家   
   发表时间:2005-02-18  
就多读一次又何妨,Dao写2个方法
提供分页方法就用findBbsBack1
public List findBbsBack1(String mainId, int pageNum, int pageSize) throws DataAccessException;
取得总数
public int getTotalCount();
0 请登录后投票
   发表时间:2005-02-19  
紧急下潜 写道
就多读一次又何妨,Dao写2个方法
提供分页方法就用findBbsBack1
public List findBbsBack1(String mainId, int pageNum, int pageSize) throws DataAccessException;
取得总数
public int getTotalCount();


为什么你 回答我的问题,我总感觉你没看完我的提问呢。  都 没答到点子上, 比如 这个问题,  你不过重复了一下我的 问题。 根本 没 听你什么 有 价值的 建议 。

请原谅 我 这么说,  以前你回答我的问题也是 。  好像 总是答非所问。
0 请登录后投票
   发表时间: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();;
            }

        });;
    }
0 请登录后投票
   发表时间:2005-02-20  
引用
当然是用数据库分页好了..

假如数据库数据有几十万条或者更多,那效率就很明显了..


但是我刚刚看了一个教程关于hibernate 用list还是Iterator的问题。里面涉及了JCS  . 大概是说如果用 了JCS  那么Iterator的话,  在 第一次从数据库中取出来后,以后 就 不用再在数据库中取了。

我理解是: 比如   有 100条记录,  如果不用分页 那么 Iterator 的话,第一次可能慢 取了100(一个疑问如果100万条呢,一次最多取多少条,好像100条一次应该没问题都能取走 oracle) 条, 然后   呢,每页显示10条。  第一页 显示 10。翻下一页, 显示 10-20条,那这些记录 就 不是从数据库取的是从JCS 中取得。那速度应该很快,。。。。

而反观 那种分页的。  它第一次 取 10条记录, 即使用了Iterator 那 它也只 保存了10条在JCS里 。 当 第二页时候还要去数据库取。

我感觉,就是在后面页 的数据显示方面,分页读取方式  都将处于劣势。

如果这样成立的话。那 设置 分页查询 反倒是慢了。


不知道对不对。 希望大家各抒己见。谢谢。
0 请登录后投票
   发表时间:2005-02-21  
JCS?什么时候的东东拉?现在早改ehcache拉。
robbin好像有篇文章详细分析吧,找找看。
0 请登录后投票
   发表时间:2005-02-21  
我觉得2实现起来本身就是个问题,先不看效率。
0 请登录后投票
   发表时间:2005-02-21  
http://blog.csdn.net/rosen/archive/2005/01/26/269612.aspx

楼上说得ehcache
0 请登录后投票
   发表时间:2005-02-21  
差沙 写道
我觉得2实现起来本身就是个问题,先不看效率。


可是我运行是出效果的。什么问题啊 ?
0 请登录后投票
   发表时间:2005-02-21  
我也想知道hibernate里怎么分页,我现在的系统采用的sql分页,速度还比较快,不知道hibernate里面怎么处理这个问题?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics