Shiro对Session操作doReadSession、update频繁读取和更新问题说明
Shiro + SSM(框架) + Freemarker(jsp)讲解的权限控制Demo,还不赶快去下载?
在最近的Shiro Demo项目中,有的同学关注了 Demo 的性能,发现项目中对 Session 的操作非常频繁,比如对 Session 的read
、update
,操作频繁。关于这个问题,我下面做下我理解(不一定正确)的解答。
为什么出现这个问题?
1.Shrio Session自身操作。
Session 中有一些自己的操作,比如Session
中会有LastAccessTime
,那是不是访问一次得更新一次呢?而我们的 Demo 中 Shrio Cache 用的是 Redis ,所以这方面性能相对来说是操作频繁了。
2.你对Session的操作
你对Session
在改变的时候,比如你往Session
中set
一个值,那就是2个操作,先readSession
,然后在updateSession
吧。get
值的时候,也是一个readSession
操作。
.......
怎么解决或者说怎么优化这个问题。
1.替换Cache。
直接解决的并没有,有的人说替换成 Ehcache ,其实是一个直接解决的方案,但其实不是,我还是觉得不能比较,缓存 Ehcache 是读本地的缓存,也就是JVM
共享的缓存。但是该update
还是updateSession
,该read
还是readSession
,所以我说其实没解决。
2.减少次数。
我们在web.xml
里面配置的时候,配置如下。
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
url-pattern
这个配置项,我们改成我们的请求后缀的方式。
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
这个*.do
是我们访问的时候,我们的org.springframework.web.servlet.DispatcherServlet
或者其他 Controller 层的框架的中央拦截器配置的访问方式。
如果有多个,就配置多次。
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
或者把Filter
自己重写一下,符合自己的业务。比如一些静态文件,或者不用带用户(身份)的请求,都可以不用管。
3.和本地缓存结合使用。
群里有一个同学就用本地缓存,ApplicationContext
然后在对 Session 操作的时候,减少对 Redis 的访问。然后感觉结果很明显。
个人总结,如果是小项目,一个 Tomcat 就解决的,最好的选择就是 Ehcache 。如果是大的项目还是想用 Ehcache ,那么可以用 Terracotta 来实现,其实在 Redis 集群下,内网连接池方式其实没问题,当然该优化的优化,这个是有必要的。
版权所属:SO JSON在线解析
原文地址:https://www.sojson.com/blog/159.html
转载时必须以链接形式注明原始出处及本声明。
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。