簡單查詢資料庫,減輕多欄位表及資料庫壓力
阿新 • • 發佈:2018-12-31
最近在查詢標籤收費記錄時,要在列表中顯示車牌號資訊,而車牌號資訊在標籤資訊記錄表中,於是需要查詢標籤資訊記錄,最原始的做法:
獲取分頁的一頁記錄資料,迴圈遍歷得出標籤收費記錄物件,然後通過標籤收費記錄中的標籤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)
{
[color=red]UrpcsVehicle vehicle =vehicleDs.search(recod.getVehicleId());[/color] 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();
}
}
[color=red]vehicleList=vehicleDs.queryVehicleById(objs);[/color] }
很明顯,這樣查詢不必頻繁查詢標籤資訊記錄,效率也會相應提高,後臺輸出也會相應減少!
來看看vehicleDs.queryVehicleById(objs[])來如何操作的:
public List queryVehicleById(Object[] vehicleNumber){
DetachedCriteria criteria =DetachedCriteria.forClass(UrpcsVehicle.class);
[color=red]criteria.add(Expression.in("vehicleNumber",vehicleNumber));[/color] 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();
}
});
}
一般如此得到一個表中的一個欄位的記錄,但上面的內容無需採用此方法,直接迴圈把內容存入到陣列中即可!
獲取分頁的一頁記錄資料,迴圈遍歷得出標籤收費記錄物件,然後通過標籤收費記錄中的標籤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)
{
[color=red]UrpcsVehicle vehicle =vehicleDs.search(recod.getVehicleId());[/color] 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();
}
}
[color=red]vehicleList=vehicleDs.queryVehicleById(objs);[/color] }
很明顯,這樣查詢不必頻繁查詢標籤資訊記錄,效率也會相應提高,後臺輸出也會相應減少!
來看看vehicleDs.queryVehicleById(objs[])來如何操作的:
public List queryVehicleById(Object[] vehicleNumber){
DetachedCriteria criteria =DetachedCriteria.forClass(UrpcsVehicle.class);
[color=red]criteria.add(Expression.in("vehicleNumber",vehicleNumber));[/color] 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();
}
});
}
一般如此得到一個表中的一個欄位的記錄,但上面的內容無需採用此方法,直接迴圈把內容存入到陣列中即可!