疯狂的sql查询,随时可能引发性能问题
今天review了群发sms的一段代码,差点没吓死我。 代码如下
for (MtnPlanTosendlist mtnPlanTosendlist:tempList){
int memberSendTodayCount = getToDayLimit(defaultBo,getMemberSentDal(mtnPlanTosendlist));
int memberSendMonthCount = getMonthLimit(defaultBo,getMemberSentDal(mtnPlanTosendlist));
if ((memberSendTodayCount < smsTodayLismitMember) && memberSendMonthCount < smsMonthLimitMember){
insertList.add(mtnPlanTosendlist);
}
}public static int getToDayLimit(BaseBo defaultBo, MtnSmsLog mtnSmsLog) {
int count = (Integer) defaultBo.get(mtnSmsLog, COUNT_TODAY_EXT)
.getDefaultModel();
return count;
}public static int getMonthLimit(BaseBo defaultBo, MtnSmsLog mtnSmsLog) {
int count = (Integer) defaultBo.get(mtnSmsLog, COUNT_MONTH_EXT)
.getDefaultModel();
return count;
}
这段代码看的出问题吗? For 循环类名套了2个count 查询。如果前面的那个for循环有100个的话, 执行完这个代码就需要200行的sql(远程调用),悲惨呀!
开发人员切莫要把数据库操作当做local方法一样的使用。一则,db操作本质上也是远程访问,远程调用很浪费时间,特别有大量的远程访问的时候;二则,数据库资源有限,大量的数据库访问会导致数据库load的升高,从而影响程序的性能。所以。劲量要减少对数据库的访问,例如通过batch进行操作,或者batch的load到内存中,进行处理。另外,如果count的数量数据行太多的话就需要考虑中间结果,例如做一张中间表来记录当前月、当天的数量,这样也可以有效的减少数据库的访问。