主题 : jeecms每天0点的流量统计功能高并发有性能bug
级别: 解元
UID: 44799
积分:347 加为好友
威望: 4 精华: 0
主题:41 回复:110
注册时间:2013-03-12
在线时长:0.01
1#   发表于:2018-11-28 15:05:08  IP:1.59.*.*
这个毛病从以前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); 

就把问题回一下,改不改看官方了,这么久也没见有人提……
级别: 论坛管理员
UID: 122721
积分:57884 加为好友
威望: 2 精华: 1
主题:5 回复:50085
注册时间:2018-05-07
在线时长:0
2#   发表于:2018-11-28 15:07:54  IP:115.79.*.*
您好  感谢您提出的意见   我们这边会积极调试的
每天告诉自己一次,“我真的很不错”。
级别: 总版主
UID: 10736
积分:148358 加为好友
威望: 205 精华: 42
主题:287 回复:126111
注册时间:2010-09-08
在线时长:14.55
3#   发表于:2018-11-28 15:11:59  IP:115.79.*.*
谢谢您的反馈,您反馈的意见提交到我们研发部门,我们这边会进行修改
路漫漫其修远兮,吾将上下而求索!
1 共1页