前段時間有一天系統訪問量突然增加,系統每隔一兩個小時就會由於記憶體瞬時飆公升而宕機。檢視記憶體dump檔案發現其中shiro的******session物件異常多
。後來經分析才發現是由於使用spring整合shiro時配置不當導致的。當時的配置如下:
"sessionmanager"
class="org.apache.shiro.session.mgt.defaultsessionmanager">
"globalsessiontimeout" value="3600000"/>
"deleteinvalidsessions" value="true"/>
"sessionvalidationschedulerenabled" value="true"/>
"sessiondao" ref="sessiondao"/>
該配置中使用shiro自帶的使用者會話超時校驗功能,每乙個小時執行一次該邏輯。
經過研究源**發現有需要進行認證授權等驗證的請求進入的時候,defaultsessionmanager物件(即上面配置的"sessionmanager"bean)會判斷其中的sessionvalidationscheduler屬性物件是否存在(該物件負責執行會話超時校驗邏輯)。如果不存在,會建立乙個該物件,並通過scheduledexecutorservice建立守護執行緒定時執行。
但是該建立過程沒有做併發控制,當請求併發大的時候,會建立很多個s
essionvalidationscheduler物件。雖然defaultsessionmanager物件中只保留了乙個引用,但是scheduledexecutorservice建立守護執行緒中還維持了這些多餘的s
essionvalidationscheduler物件。這樣當執行週期到的時候,會有很多個執行緒一起將會話物件載入到記憶體,從而導致記憶體瞬時飆公升。
解決方法很簡單:將
executorservicesessionvalidationscheduler配置成bean,並注入到"sessionmanager"bean中。這樣就不會生成重複的sessionvalidationscheduler物件。
"sessionmanager"
class="org.apache.shiro.session.mgt.defaultsessionmanager">
"globalsessiontimeout" value="3600000"/>
"deleteinvalidsessions" value="true"/>
"sessionvalidationschedulerenabled" value="true"/>
"sessionvalidationscheduler"
ref=
"sessionvalidationscheduler"
/>
"sessiondao" ref="sessiondao"/>
"sessionvalidationscheduler"
class
="org.apache.shiro.session.mgt.executorservicesessionvalidationscheduler"
>
"interval"
value=
"3600000"
/>
"sessionmanager"
ref=
"sessionmanager"
/>
shiro與spring的整合
1.除了spring本身專案的jar包,還要加入四個jar包 1 shiro all 1.2.5.jar 2 slf4j api 1.7.7.jar 3 slf4j log4j12 1.7.7.jar 4 log4j 1.2.17.jar 2.首先進行web.xml的配置 參考官方的文件 需要在we...
shiro學習筆記(5) spring整合
spring整合shiro 1 1 jar org.apache.shiro shiro spring 1.2.3 2 web.xml contextconfiglocation classpath spring shiro.xml org.springframework.web.context.c...
整合struts和spring時
連線點 struts2的action由spring產生 大致如下 首先加入各自所需的jar包,連線時要加入struts2 spring plugin x.x.x.jar 1.修改web.xml加入struts的filter struts2 org.apache.struts2.dispatcher....