1. 程式人生 > >在Struts2中存在的併發問題(個人記錄)。

在Struts2中存在的併發問題(個人記錄)。

歡迎加群交流:8028492

我最近在做專案的時候遇到一個問題:
查詢出來的資料是有許可權判斷的
我換臺電腦去查詢 許可權是可以判斷出來的 但是在上臺電腦查詢的快取 缺出現了這臺電腦上 當是以為是session快取 等 沒有搞清楚

最後我考慮到了併發這個事件上 以為用執行緒鎖Synchronized可以解決這個問題
由於框架是Struts2的 我在action中加了執行緒鎖並沒有用

由於是職場新人 很多東西都不是很熟練 我在網上找了很久 也不知道是怎麼回事
最後我考慮到了框架的問題 在框架這裡發現了問題 (自己太大意 沒考慮到這裡)

原來在Struts框架中 :struts1和struts2是有差別的
struts2的每次請求都會產生一個session,導致了這個沒有併發的問題。相當於每次都會訪問這個session。而在action 的配置檔案中的bean裡配置 scope=”prototype”
屬性 就很好的解決了

參考:

在配置檔案中,bean預設是單例模式,應用伺服器啟動後就會立即建立bean,以後就可以重複使用。

這帶來一個問題,bean的全域性變數被賦值以後,在下一次使用時會把值帶過去。也就是說,bean是有狀態的。

在web狀態下,請求是多執行緒的,全域性變數可能會被不同的執行緒修改,尤其在併發時會帶來意想不到的bug。

而在開發時,訪問量很小,不存在併發、多執行緒的問題,程式設計師極有可能會忽視這個問題。

所以在配置action bean時,應使用scope=”prototype”,為每一次request建立一個新的action例項。這
符合struts2的要求,struts2為每一個request建立一個新的action例項。當request結束,bean就會被jvm
銷燬,作為垃圾收回。

當然,也可以設定scope=”session”,也能避免web中action的併發問題,只為當前使用者建立一次bean,直至
session消失。在這種情況下,對當前使用者而言,bean是有狀態的。好處就是少建立bean的例項,有那麼一
點點效能的提升

應用場景:
1. 多數情況下應使用prototype
2. 若使用者不多,且頻繁操作(頻繁使用action),硬體一般,可以考慮session,興許還能提升一點點效能。

歡迎加群交流:8028492