日期:2014-05-16  浏览次数:20509 次

简单查询数据库,减轻多字段表及数据库压力
最近在查询标签收费记录时,要在列表中显示车牌号信息,而车牌号信息在标签信息记录表中,于是需要查询标签信息记录,最原始的做法:
  获取分页的一页记录数据,循环遍历得出标签收费记录对象,然后通过标签收费记录中的标签ID来查询标签信息对象,保存在List对象中:

    List vehicleList =new ArrayList();
   if(rs.list!=null && rs.list.size()>0){
for(int i=0;i<rs.list.size();i++)
{
  UrpcsConsumptionRecord recod =(UrpcsConsumptionRecord)rs.list.get(i);
if(recod!=null)
{
  UrpcsVehicle vehicle =vehicleDs.search(recod.getVehicleId());    vehicleList.add(vehicle);
}
}
     }
 
    对于上述操作,我特别提出vehicleDs.search(ID)方法,对于拥有众多字段的标签信息来说,查询整条记录,务必会影响查询效率和对数据库产生压力,看看search的实现方法:
      public UrpcsVehicle search(String vehicleId) {
return load(UrpcsVehicle.class, vehicleId);
     }
    对于此操作,造成后台不断打印出很多关于search记录(一页显示20条记录,1秒钟打印出20条search查询结果),如果频繁查询收费信息,会对数据库造成很大压力,直至拖垮数据库!
    对此,我想到只需要获取收费信息中一个标签数组,这样不用循环查询标签信息,是否能提高效率,提高性能啦!做法如下:
    List vehicleList =new ArrayList();
   if(rs.list!=null && rs.list.size()>0){
       Object[] objs =new Object[rs.list.size()];
       for(int i=0;i<rs.list.size();i++)
       {
UrpcsConsumptionRecord recod =(UrpcsConsumptionRecord)rs.list.get(i);
if(recod!=null)
{
   objs[i] =recod.getVehicleNumber();
}
       }
      vehicleList=vehicleDs.queryVehicleById(objs);   }

   很明显,这样查询不必频繁查询标签信息记录,效率也会相应提高,后台输出也会相应减少!
    来看看vehicleDs.queryVehicleById(objs[])来如何操作的:
    public List queryVehicleById(Object[] vehicleNumber){
       DetachedCriteria criteria =DetachedCriteria.forClass(UrpcsVehicle.class);
       criteria.add(Expression.in("vehicleNumber",vehicleNumber));       return getHibernateTemplate().findByCriteria(criteria);
   }
   虽然此方法使用了in查询,在一定程度上影响了数据库效率,但相对上面的查询,还是相对效率高些(个人看法)

   下面来看看一般如何获取object[]数组的:
   public Object[] getPopedomRole(final int RoleID){
return  (Object[]) getHibernateTemplate().execute(
         new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
String sql = "select popedomId from UrpcsPopedomRole a where a.roleId="+RoleID+"";
Query query = session.createQuery(sql);
List list = query.list(); return list.toArray();
}
});
   }
  一般如此得到一个表中的一个字段的记录,但上面的内容无需采用此方法,直接循环把内容存入到数组中即可!