重大改版
 鱼翔空 2013-06-19 技术总结|   0 941 
文章评分 90 次,平均分 5.0

二十九:application中都保存了什么东西?

   1,登录用户的user对象

      当前用户的一般属性,不包含关联的集合属性(为了减少session的存储量)

      计算出来的用户的权限总和long[] rightSum;

      当用户登录时,验证通过以后计算出来的该用户的权限,

    * 如果想让用户权限的实时跟随者改变,只要在管理修改该用户的权限的时候,我们就将该用户的session给清除掉,或者将它的计算session的方法再重新执行一遍

    但是我们如何在修改了用户的权限时候获得该用户的session呢?

      须知session在每个访问对象中都是独立的,如果能清空了该用户的session,那么该用户需要重新登录,在操作时,特别是更新时的数据,如何保存?

    * 我们可以让用户的权限在下次登录的时候生效

  2,url与Right对应的map集合,主要是访问的时候,获取url的权限位和权限码,到时候去和用户中计算出来的权限总和做&运算

     *如果url不是一次性添加的,而是每次点击的时候,我们添加一个url到right中,在没有修改role的情况下,这个对用户是没有影响的

 如果我们给role添加了刚添加的url的right,那么用户在重新登录的时候,就会找不到application中对应的url,而我们设计的是没有url的话,我们认为该url是公共资源,这么一来所有的用户都能访问到该url,所以我们要添加过url过后,刷新application中的存放的map集合

     * 如果我们删除rights表中的url后,那么用户访问了该url后,应该是在map中找不到url的,就认为是公共资源,

   靠,想的太多了,只需要变化就刷新application就行了

三十:重写struts的ui标签实现细粒度的权限控制

    在tomcat容器中,读取.class文件是先从用户自己写的.class中查找

    而jboss中则是先查找jar包,然后再读取用户的.class文件

    我们只需要将重写后的.class文件放入到jar包中就可以了

    重写标签主要是重写

     dostartTag

     doendTag

三十一:使用spring缓存模块优化

<?xml version="1.0"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ehcache="http://www.springmodules.org/schema/ehcache"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
                            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                            http://www.springmodules.org/schema/ehcache
                            http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd">
        <!-- 配置ehcache缓存过期策略文件 -->                       
        <ehcache:config configLocation="classpath:ehcache.xml"/>
         
        <!-- 缓存代理 -->
        <ehcache:proxy id="surveyServiceCacheProxy" refId="surveyService">
         
            <!-- 缓存数据的方法 -->
            <ehcache:caching methodName="get*" cacheName="surveyCache"/>
            <ehcache:caching methodName="load*" cacheName="surveyCache"/>
            <ehcache:caching methodName="find*" cacheName="surveyCache"/>
            <ehcache:caching methodName="is*" cacheName="surveyCache"/>
             
            <!-- 清除数据的方法 -->
            <ehcache:flushing methodName="save*" cacheNames="surveyCache" />
            <ehcache:flushing methodName="update*" cacheNames="surveyCache" />
            <ehcache:flushing methodName="delete*" cacheNames="surveyCache" />
            <ehcache:flushing methodName="batch*" cacheNames="surveyCache" />
        </ehcache:proxy>
             
    </beans>

ehcache.xml文件中的内容

<?xml version="1.0" encoding="utf-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
        <diskStore path="java.io.tmpdir"/>
        <defaultCache
                maxElementsInMemory="10000"
                eternal="false"
                timeToIdleSeconds="120"
                timeToLiveSeconds="120"
                overflowToDisk="true"
                maxElementsOnDisk="10000000"
                diskPersistent="false"
                diskExpiryThreadIntervalSeconds="120"
                memoryStoreEvictionPolicy="LRU"
                />
         
        <cache name="surveyCache"
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            maxElementsOnDisk="10000000"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
            />
    </ehcache>

由于缓存代理又在spring的事务代理上加了一层,在action中导入service的时候

使用surveyServiceCacheProxy这个service,可以将代理引入进来

三十二: hibernate的缓存

  内置缓存: 又叫一级缓存包含session缓存和sessionfactory缓存

    特点:不能关闭,强制性的,驻留在session中,存放的是当前工作工作单元加载的对象,可以理解为是一个类中的map属性,缓存可以理解为本地的数据库(一般程序和db是分开的,需要带宽,降低网络负载和db压力),在session中的操作尽量的短(db的链接),长时间运行,也可能导致并发问题

    *  sessionfactory缓存: 预先生成的所有的sql语句和映射元数据,buildSessionfacotry()时生成,增删改一般直接取,除非是动态生成的sql语句

    *  sessionfactory中还包含了hibernate的二级缓存,本身是用hashtable实现,真正使用的时候是用第三方的二级缓存实现的,

    *  session中的缓存

        1,增删改对象时,缓存的是持久化对象,和将要执行的sql语句

              使用hql批量操作的时候,缓存的是sql语句和参数对象

        2,查询,缓存的查询出来的持久化对象,并放入到快照中一份

    外置缓存:二级缓存

       默认是开启,可插拔的,ehcache,osCache,swarmCache ,jbossCache(分布式缓存)

三十三:数据库的锁

  悲观锁: 比较悲观,不能出问题,出了问题就悲观了,在数据库中加字段(锁旗标),效率低,不过安全,不支持并发,串行化

  乐观锁:支持并发,并发能解决,在数据库中加版本或者时间戳(并不一定能保证)


 

除特别注明外,本站所有文章均为我要编程原创,转载请注明出处来自http://5ycode.com/article/228.html

关于
该用户很懒!
切换注册

登录

忘记密码 ?

切换登录

注册

扫一扫二维码分享