简单查询数据库,减轻多字段表及数据库压力
最近在查询标签收费记录时,要在列表中显示车牌号信息,而车牌号信息在标签信息记录表中,于是需要查询标签信息记录,最原始的做法:
获取分页的一页记录数据,循环遍历得出标签收费记录对象,然后通过标签收费记录中的标签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();
}
});
}
一般如此得到一个表中的一个字段的记录,但上面的内容无需采用此方法,直接循环把内容存入到数组中即可!