java中关于static的一个小问题

 
      今天突然想到前几天思考的一个问题,就是我们通常在一个war包(或是别的j2ee的程序包)为了提升性能,采用了一些“缓存”来存储一些开销比较大的资源,这样使用它们时就会节省很多new的时间,这些“缓存”我们通常用static型的变量来做,我们知道一个类的多个对象间是共享一个static型变量的,但问题在于这些是在war包中,如果我们是在一个普通的java程序中定义的一个static变量,每次执行同一个类的main()方法来调用该变量却没有达到共享的目的,这是为什么了?
     其实道理很简单,就是我们在执行一个java程序的main方法是,是开启了一个进程来启动jvm执行该方法,执行完后进程结束,你再次执行又开启一个进程,所以static变量没有共享;而在war包中是,你启动服务器装载这个war包,相当于开启一个进程来启动jvm,同时启动了服务器来运行这个war包,以后你的操作容器会生成一个线程来做,所以这里你的static变量是在线程间通过class对象来共享的,而jvm一直开启,所以其装载的class对象也没有发生变化,当然static变量能够共享了。但如果你关闭了服务器,结束该进程,则static不能留到下次启动服务器时还共享了,这就相当于上面的运用普通java程序的main()方法一样。
       那我们怎样在java下作到进程间的数据共享了,一是可以把一些信息持久化,如保存到数据库、文件中;另一种就是把对象序列化,它也可以做到在进程间的传递,如rmi、corba、jms都能在进程级别下共享可序列化的对象,但又一点要注意就是类中的static变量不能被序列化保存。
        下面说一下我们在web项目中的数据库方面的优化。我们知道web项目中性能是会有很大差别的,从底层到最上面,我们可以分为Hardware--OS--JVM--Application Server--Application Software五层,在这五层中可以显著改善性能的是硬件和应用程序两部分,其中对于我们程序员来说修改程序来提升程序性能是比较合适的,那在web项目中一般性能的瓶颈往往在于数据持久化那部分,也就是数据库那部分,那我们的做法一般有这么几种:
        一.对于数据量大的表准备一个备份的temp表,对于一些统计方面的工作可以针对temp表进行,从而减缓对原表的压力。这也就是以“空间换时间”的策略。对于要进行登陆验证的帐号表,我们可以把帐号分为活跃用户和非活跃用户两种,分别存在不同表中,这样活跃用户验证表的数据就要少多了,这样登陆验证的速度就会加快很多。当然对于活跃和非活跃用户之间的切换要有个策略。
       二.对表的某些字段建索引。
       三.对SQL语句优化。
      
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值