如题,目前所在的公司有几个在用的十分老久的系统,缓存都是用的静态变量,目前增改参数都是需要重启系统,而我们的系统过于臃肿,每次重启十分麻烦。
目前领导提出了新需求:一个按钮清除所有缓存。
讲道理我想辞职了,不过还是先努力一番,集思广益说不定就成了?
求各位大佬解惑,感激不尽。
生产环境版本: jdk 1.6
1
kaneg 2017 年 3 月 6 日
你明确的需求是什么? 清除缓存还是修改参数?
如果要清除缓存,只要把相应的缓存变量清空即可,当然,前提条件这些缓存变量在你的控制范围内。 如果是增改参数,那就提供相应的接口,外部可以控制 |
2
simonlei 2017 年 3 月 6 日
静态变量只是一个 ClassLoader 里面是静态的,换个新的 ClassLoader 就可以换静态变量了。 Eclipse 就是靠这种方式来达到动态加载 plugin 的。
不过要改造老旧的系统,达到这样的效果,我觉得也是个不小的工作量。 |
3
caixiexin 2017 年 3 月 6 日 via Android
是静态变量还是 final 的静态变量呢,没有 final 的话,静态变量也能重新赋值不是?
|
4
smithtel OP |
6
kaneg 2017 年 3 月 6 日 via iPhone
如果都找不到这些静态变量在哪里,就算把它们重置,那你怎么让它们重新初始化呢
|
7
SoloCompany 2017 年 3 月 6 日
class loader 置换是有代价的,因为 permgen 很难被回收
即使你的业务代码足够简单,完全没有资源竞争(不需要 listen 端口,不需要独占打开文件),因为初始化总是避免不了,你所描述的问题(重启十分麻烦)大几率还是无法避不开,问题出现在你们自己业务代码上要比在 jvm 启动上的可能高的多 所以不要想什么捷径,该靠业务代码来 reload / 清 cache 的就别想着从外面解决 当然你也可以尝试一下使用反射遍历所有业务 class 的静态 field ,如果是某种类型的,就执行 clear 方法;当然如果你把 [某种类型] 理解为 Map 的话,当我没说过吧 |
8
odirus 2017 年 3 月 6 日
虽然重启复杂,但楼主还是想想怎么把重启改成自动化吧,修改代码是大忌啊,特别是老旧、没文档的系统,一不小心就引出莫名其妙的 BUG ,多想想怎么自动重启,总比你修改代码来得直接把。
|
9
smithtel OP @SoloCompany 啊啊啊,有很多业务代码是有持续的读写文件。不过最后这个方法倒是一个可行点,代码里面是有很多 list 和 map ,这是可以想办法去搞的。
|
10
des 2017 年 3 月 6 日 via Android
同意 8 楼的,不如弄个一键重启
|
11
zhoujinjing09 2017 年 3 月 7 日
用 spring 的 DI ,把静态类都变成单例,应该就能热重启了
|
12
smithtel OP |