javaweb项目中使用全局静态变量问题

晓晓程序员 2012-08-05 09:30:14
我的项目是SSH2开发的。我在一个纯java类(叫Test.java)里定义了一个静态属性:public static int a=0;之后我在struts2的action里调用Test.a="用户请求传过来的值",这样按理说是所有用户的请求都可以改变这个静态变量a的值,但结果是在本地myeclipse里运用tomcat服务器不会出错,a的值会改变,但是把这个部署到真实项目上去(也是tomcat服务器)时就不行了,a值始终不对,貌似一直没赋起值。
...全文
684 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
晓晓程序员 2012-08-12
  • 打赏
  • 举报
回复
找到问题了。。O(∩_∩)O谢谢了各位!!
MiceRice 2012-08-06
  • 打赏
  • 举报
回复
生产环境就是指正式环境。。。。。。

因为生产环境不需要调试,也不需要动态部署这类能力,或者说怕有这类能力。
实际上生产环境连JSP编译检查都会关闭掉。
MiceRice 2012-08-05
  • 打赏
  • 举报
回复
用静态变量来传递用户请求?这个做法非常的有问题,这在并发环境下基本上是乱套的。

你说“a值始终不对”,是指a值一直都是0?还是a值一直都不是你期望的值?

如果是后者,那就正常,并发环境大家都来修改a值,乱七八糟是很正常的。
「已注销」 2012-08-05
  • 打赏
  • 举报
回复
服务器里打印一下看看到底赋上值没有啊,是不是用的人太多了 ,值变化的太快了的缘故啊
晓晓程序员 2012-08-05
  • 打赏
  • 举报
回复
生产环境中,reloadable 和 autoDeploy 本来就应该是 false。
那在正式系统上reloadable 和 autoDeploy 是true?
我明天再去公司看看,仔细调试下,看看,谢谢大师的指点。
MiceRice 2012-08-05
  • 打赏
  • 举报
回复
似乎不应该是这个问题,因为:如果Tomcat不停的执行 reload,你的程序也没法正常用了,总是在彻底清掉环境,这系统自己都卡死球了。。。

我觉得问题本质不是在这里,除非你的应用其实本来就根本跑不起来。


顺带说一句:生产环境中,reloadable 和 autoDeploy 本来就应该是 false。
晓晓程序员 2012-08-05
  • 打赏
  • 举报
回复
在myeclipse里调试不会出错,,就是部署到真实项目上就出错了,,,这里我看了一截信息:

而当执行完StandardContext的reload操作后,当被访问的请求代码中使用了log4j,logger会报空指针错误。根本原因是,StandardContext做reload操作时,其中一个步骤会调用WebappClassLoader的stop操作,而在WebappClassLoader的stop操作时,会根据变量ENABLE_CLEAR_REFERENCES的值(默认true),来清除static或者final变量的值,被清除后,再访问就自然会出错。
因此,
1,可以通过设置ENABLE_CLEAR_REFERENCES为false来解决这个问题(通过-Dorg.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES="false"来设置系统变量)
2,或者设置不进行重加载操作。context.xml中增加reloadable="false"属性
3,或者设置不进行自动Deploy操作。Host节中的autoDeploy="false"
4,Eclipse开发的话,Server属性中的把Automatically publish when resources chage改为Never publish automatically

所以我觉得可能是tomcat的问题,但我又不敢轻易改tomcat的这些配置信息,害怕会影响到其他的,会出现其他错误。
MiceRice 2012-08-05
  • 打赏
  • 举报
回复
我觉得不会是 public static int a 本身的问题。

只能是其它的地方存在误用,你可以专门写个JSP试试看:
<%
System.out.println(new Date() + " " + Test.a);
out.write(new Date() + " " + Test.a);
Test.a ++;
%>

刷新几次,然后看看别的地方是否能正确得到这个 Test.a
晓晓程序员 2012-08-05
  • 打赏
  • 举报
回复
实在不行就只有保存到数据库中或保存到一个文本里了,,没法呀。。。哎,,session也不行的,我是要手机端得到这个值,手机无法得到服务器session的值。。
晓晓程序员 2012-08-05
  • 打赏
  • 举报
回复
是呀,,我也感觉很奇怪。。是同一个JVM的同一个Web应用。
MiceRice 2012-08-05
  • 打赏
  • 举报
回复
听起来比较奇怪。。。都是同一个JVM的同一个Web应用么?
晓晓程序员 2012-08-05
  • 打赏
  • 举报
回复
a值一直都是0,没有赋起值~~~~~~~
晓晓程序员 2012-08-05
  • 打赏
  • 举报
回复
a值一直都是0
MiceRice 2012-08-05
  • 打赏
  • 举报
回复
不过楼主还是没回答我的问题。
晓晓程序员 2012-08-05
  • 打赏
  • 举报
回复
我要的就是所有用户共享这个值,所有人都可以改变这个值,所有人也可以得到改变的这个值,你们不用考虑并发问题,我非常清楚这个,我的需求是这样。。。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧