static属性的生命周期

结论

类的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;

/**
* 给指标组添加属性
* @param ids
* @return
*/
@Override
public ArrayList addAttributesForIds(List<Integer> ids)
{
// 仅在data属性为null的情况下,才会从数据库加载数据
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;
}

/**
* 初始化数据
*
* @return
*/
protected HashMap<Integer, Object> initCache()
{
// 从数据库读取信息,并返回
}
}

后面将这个属性设置为非static属性,解决了这个问题。