回覆列表
  • 1 # Abnnjhg

    struts2中action是多例的,即一個session產生一個action如果是單例的話,若出現兩個使用者都修改一個物件的屬性值,則會因為使用者修改時間不同,兩個使用者訪問得到的屬性不一樣,操作得出的結果不一樣.舉個例子:有一塊布長度300cm,能做一件上衣(用掉100cm)和一件褲子(用掉200cm);甲和乙同時訪問得到的長度都是300cm,甲想做上衣和褲子,他先擷取100cm去做上衣,等上衣做完再去做褲子,而乙這時正好也拿100cm去做上衣,那好,等甲做完上衣再做褲子的時候發現剩下的布(100cm)已經不夠做褲子了.....這就是影響系統的效能,解決的辦法就是給甲和乙一人一塊300cm的布,就不會出現布被別人偷用的事情,也是就單例項和多例項的區別如果設定成單例,那麼多個執行緒會共享一個ActionContext和ValueStack,這樣併發訪問的時候就會出現問題了struts 2的Action是多例項的並非單例,也就是每次請求產生一個Action的物件。原因是:struts 2的Action中包含資料,例如你在頁面填寫的資料就會包含在Action的成員變數裡面。如果Action是單例項的話,這些資料在多執行緒的環境下就會相互影響,例如造成別人填寫的資料被你看到了。所以Struts2的Action是多例模式的。問題出現了,可以讓struts2的action變成單例模式麼?我在使用spring來生成action的時候,發現生成的action居然全是單例的。這不是讓我的程式預設就跑出bug來麼?上個使用者提交的資訊,如果下個使用者沒填,居然跑到上個使用者輸入的資訊去了。背景:1) Struts2會對每一個請求,產生一個Action的例項來處理.2) Spring的Ioc容器管理的bean預設是單例項的.首先從資料安全性的問題上考慮,我們的Action應該保證是多例的,這樣才不會出現數據問題。但是如果有的action比如只有admin才能操作,或者某些action,全站公用一個來提高效能,這樣的話,就可以使用單例模式。不過幸好,Spring的bean可以針對每一個設定它的scope,所以,上面的問題就不是問題了。如果用單例,就在spring的action bean配置的時候設定scope="prototype".好吧,問題到此結束。

  • 中秋節和大豐收的關聯?
  • 西方神話中的冥界或地獄是什麼樣子?