这个毛病从以前v6 就已经有了,现在用的是v9.3
每天凌晨都会出现cpu高负荷,各种动态页都不能打开,看了一下tomcat就是mysql连接超时,去看MySQL的慢日志,记录的是全是这个结果
# Query_time: 9.343914 Lock_time: 0.000197 Rows_sent: 39776 Rows_examined: 82757
SET timestamp=1533423276;
...
from jc_site_access
以前反映过这个问题
http://bbs.jeecms.com/azsy/71840.jhtml
今天终于把这个问题解决了,简直就是个bug,官方没做过统计功能的性能测试吧……
CmsSiteAccessDaoImpl.java 这个类里面有个方法 findRecentAccess,程序逻辑是这样的
public CmsSiteAccess findRecentAccess(Date date,Integer siteId){
Finder f = Finder.create("from CmsSiteAccess access where access.site.id=:siteId and access.accessDate!=:accessDate order by access.accessDate desc ")
.setParam("siteId", siteId).setParam("accessDate", date);
List<CmsSiteAccess> list = find(f);
if (list != null && list.size() > 0) {
return list.get(0);
} else {
return null;
}
}
每天0点一定会执行一次这个方法,而执行结果就是把全表查询导出到tomcat内取第一条数据来判断时间……
我的天,写这段程序的人不知道在想啥,每天如果只有几千人访问到还好,如果访问人数达到几万,这表里面数据导出一次性可得要几秒钟,有时候性能差点就要10几秒
这也是性能bug根源,并发100人同时访问,10几秒数据无返回,造成mysql、tomcat同时一起锁死
把查询那句改成,一次只查询一条记录,再去find方法里面加个limit就行……
List<CmsSiteAccess> list = find(f, 1);
就把问题回一下,改不改看官方了,这么久也没见有人提…… |
|