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語句優化。
      
  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章