结论
类的static属性,其生命周期是和tomcat进程一致的,不同的请求会公用这些static属性。
因此如果你想每个请求都初始化某个属性,就不能将其设置为static,应该改为普通的属性。
案例
有一些配置信息来自我们的运营后台,我在程序中将这部分信息读取到后,存放在了一个static属性中,并且每次使用这些数据时,会判断这个static属性是否已经被初始化,如果已初始化了,就不再重新从数据库读取数据。
然后就出现一个问题,我们后台修改了这部分配置信息,但是后续用户的请求过来后,读取到的仍然是内存中的老数据。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| public class MySQLCacheServiceImpl implements CacheService {
protected static HashMap<Integer, Object> data = null;
@Override public ArrayList addAttributesForIds(List<Integer> ids) { if (null == data) { data = initCache(); } ArrayList dataList = new ArrayList(); for (int id : ids) { if (null != data.get(id)) { dataList.add(data.get(id)); } } return dataList; }
protected HashMap<Integer, Object> initCache() { } }
|
后面将这个属性设置为非static属性,解决了这个问题。