實際工做中遇到關於Struts2線程安全的問題解決

    今天工做遇到一個難纏的bug,浪費了2個小時終於解決。前端

           問題描述:對資源的管理中用到關鍵字查詢以及分頁查詢。視圖控制器用到struts2,數據存儲用spring的data-mongodb來存儲數據以及查詢數據。可是發現一個問題,在用分頁查詢時能查詢出全部記錄,而後用關鍵字查詢獲取查詢內容後,在用分頁查詢可是隻能獲取關鍵查詢的數據,其餘數據死活查詢不出來。開始我覺得是本身前端有邏輯問題,可是我用其餘的瀏覽器操做一樣出問題。所以知道問題出在後臺代碼。開始覺得是否是數據有緩存,可是其餘模塊也這樣實現沒問題,糾結了半天,最後我對比了其餘模塊在struts.xml配置中差別,發現其餘模塊的action中spring配置有scope=''propotype",可是又想若是是線程安全問題,也不該該是由於action,給數據有關應該是service層或是dao層,可是仍是這樣嘗試修改一下,奇蹟出現了,問題解決了。開始我覺得struts2是線程安全的他經過過濾每次請求都會實例化,交給spring管理應該默認都是propotype.因此我思考問題所在。最後終於明白了。spring

     bug緣由:因爲sttruts2交個spring管理默認是單件模式,因此就建立一次對象,這樣就有線程安全問題,其餘請求訪問時,因爲關鍵查詢,key一直存在值,因此在回到分頁查詢其實執行的仍是關鍵字查詢,這就形成了以上問題,是個典型的線程安全問題。mongodb

  技術總結:瀏覽器

Struts 2 Action對象爲每個請求產生一個實例,所以沒有線程安全問題。
Spring的Ioc容器管理的bean默認是單實例的,上一次請求處理的狀態信息被保持下來,並影響了下一次的請求,實際上就是Action中的類變量被不一樣的請求讀取,出現錯誤結果緩存

解決:就是不用單例, spring中bean的做用域設爲prototype,每一個請求對應一個實例. 安全

相關文章
相關標籤/搜索