List companyList=getCompanyList();
for(JSONObject company:companyList){
List todayBirthdays=getBirthdayUsers(getdate(0),company.getString("id"));
StringBuffer name=new StringBuffer();
StringBuffer ids=new StringBuffer();
StringBuilder hrsb = new StringBuilder();
ids.append("'");
ids.append("2017121618514C22B68296F31AF8DDE2");//不给XX发
ids.append("'");
ids.append(",");
String userIds ="";
if(todayBirthdays.size()>0){
for (JSONObject o : todayBirthdays) {
name.append(",");
name.append(o.getString("name"));
ids.append("'");
ids.append(o.getString("id"));
ids.append("'");
ids.append(",");
}
userIds = ids.toString().substring(0, ids.toString().length() - 1);
if (name.length() > 0) {
name.deleteCharAt(0);
}
List remindUsers=userDao.getViewJSONListByCondition(" AND companyId=? AND jobState!=1 AND id NOT in("+userIds+") GROUP BY id",new Object[]{company.getString("id")});
for (JSONObject hrUser : remindUsers) {
hrsb.append("|");
hrsb.append(hrUser.getString("id"));
}
if (hrsb.length() > 0) {
hrsb.deleteCharAt(0);
}
JSONObject msgObject = new JSONObject();
msgObject.put("userIds", hrsb);//object.getString("id")
msgObject.put("content", String.format(TODAY_BIRTHDAY_REMIND, name));
tokenDao.sendTextMsg(JSON.toJSONString(msgObject));
}
第二天8.00执行 服务器ok,8.30左右服务器报错数据库连接最大,内存占用到了80%
我想问问是不是这个导致的
不知道你定时任务是多久执行一次,其次你得最好打印下生成后的字符数量,如果字符确实很长,而且任务执行频繁会耗费内存,问题不在于StringBuffer,而在于你怎么用,StringBuffer是可以循环利用的,当你用完后可以通过setLength(0)进行清空,方便内存释放,不需要每次for循环都去创建实例,每创建一个实例都会导致一定数量的字符数组的创建。所有创建一次就够了,使用setLength(0)后方可重新使用
有大神知道是哪块代码影响的吗
首先,问题和Stringbuilder没关系。其次我想吐槽一下你的代码。
我们先捋一下你这段代码逻辑:
List companyList = getCompanyList();// 先拿到companyList,不清楚这个list有多大
for (JSONObject company : companyList) {
List todayBirthdays = getBirthdayUsers(getdate(0), company.getString("id"));// 这行不清楚你想干嘛
StringBuffer name = new StringBuffer();
StringBuffer ids = new StringBuffer();
StringBuilder hrsb = new StringBuilder();
ids.append("'");
ids.append("2017121618514C22B68296F31AF8DDE2");//不给XX发
ids.append("'");
ids.append(",");
String userIds = "";
if (todayBirthdays.size() > 0) {
for (JSONObject o : todayBirthdays) {
name.append(",");
name.append(o.getString("name"));
ids.append("'");
ids.append(o.getString("id"));
ids.append("'");
ids.append(",");
}
userIds = ids.toString().substring(0, ids.toString().length() - 1);
if (name.length() > 0) {
name.deleteCharAt(0);
}
List remindUsers = userDao.getViewJSONListByCondition(
" AND companyId=? AND jobState!=1 AND id NOT in(" + userIds + ") GROUP BY id",
new Object[] { company.getString("id") });
for (JSONObject hrUser : remindUsers) {
hrsb.append("|");
hrsb.append(hrUser.getString("id"));
}
if (hrsb.length() > 0) {
hrsb.deleteCharAt(0);
}
JSONObject msgObject = new JSONObject();
msgObject.put("userIds", hrsb);//object.getString("id")
msgObject.put("content", String.format(TODAY_BIRTHDAY_REMIND, name));
tokenDao.sendTextMsg(JSON.toJSONString(msgObject));
}
}
1、在companyList每次循环都会发起数据查询,而且这个sql看起来挺重的
2、hrsb这个字符串长度与companyList成正比,names,ids还是两重循环,如果companyList长度很长,这里就有可能有问题
确实写的很乱,之前是先找过生日的人,再找公司其他人的。