不可不說
          隨心所欲,無往不利!
          posts - 88,  comments - 92,  trackbacks - 0
          在研究SS2的時候,把Source存放到數據庫中,進行角色配置,SS2把這些資源角色讀取到一個Map中
          在得到一個URL請求時,使用這個URL遍歷這個Map,查找是否存在這個Key,如果有,則取出對應的角色。
          問題就在這個遍歷Map上,源代碼如下
              private ConfigAttributeDefinition lookupUrlInMap(Map requestMap, String url) {
                  Iterator entries 
          = requestMap.entrySet().iterator();

                  
          while (entries.hasNext()) {
                      Map.Entry entry 
          = (Map.Entry) entries.next();
                      Object p 
          = entry.getKey();
                      
          boolean matched = urlMatcher.pathMatchesUrl(p, url);

                      
          if (logger.isDebugEnabled()) {
                          logger.debug(
          "Candidate is: '" + url + "'; pattern is " + p + "; matched=" + matched);
                      }

                      
          if (matched) {
                          
          return (ConfigAttributeDefinition) entry.getValue();
                      }
                  }

                  
          return null;
              }
          這個Method中一上來就作遍歷循環,為什么不先利用Map的特性直接先取一次,如果取得到,直接就返回了,
          如果取不到,再遍歷查找,這樣可以提高命中率,從而提高性能,如果找不到,這一次的Map查找性能應該
          也不是很低吧?
              private ConfigAttributeDefinition lookupUrlInMap(Map requestMap, String url) {
                 
          ConfigAttributeDefinition cad = (ConfigAttributeDefinition)requestMap.get(url);
                  if(cad != null) {
                      return cad;
                  }
                    
                  Iterator entries = requestMap.entrySet().iterator();

                  
          while (entries.hasNext()) {
                      Map.Entry entry 
          = (Map.Entry) entries.next();
                      Object p 
          = entry.getKey();
                      
          boolean matched = urlMatcher.pathMatchesUrl(p, url);

                      
          if (logger.isDebugEnabled()) {
                          logger.debug(
          "Candidate is: '" + url + "'; pattern is " + p + "; matched=" + matched);
                      }

                      
          if (matched) {
                          
          return (ConfigAttributeDefinition) entry.getValue();
                      }
                  }

                  
          return null;
              }

          當然,這要權衡系統URL配置的特性,諸如xxx*這種類型的配置多的話,還是原來的方式快一點,如果直接xxx
          這種方式多得話,我說的方式就要快一些。
          總之,沒有最好,只有更好!



          posted on 2008-09-02 21:04 藍劍 閱讀(1239) 評論(1)  編輯  收藏

          FeedBack:
          # re: Spring Security 2資源-角色查找源碼研究及性能改進[未登錄]
          2008-09-03 09:22 | Hibernating
          看過你的評論了,能具體說說在2.0應該怎么做嗎?我也事參照1.x實現的。  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           


          <2008年9月>
          31123456
          78910111213
          14151617181920
          21222324252627
          2829301234
          567891011

          常用鏈接

          留言簿(6)

          隨筆分類(62)

          隨筆檔案(90)

          文章檔案(9)

          相冊

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 325290
          • 排名 - 172

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 根河市| 横山县| 定日县| 宁武县| 九寨沟县| 应用必备| 福建省| 台东县| 兴隆县| 汪清县| 闻喜县| 汉沽区| 美姑县| 通许县| 稷山县| 盐边县| 天峨县| 奈曼旗| 白玉县| 乌拉特中旗| 辽中县| 通山县| 手游| 滨海县| 乐昌市| 洛川县| 永康市| 龙山县| 德保县| 浦北县| 云南省| 双辽市| 大同县| 阿荣旗| 闻喜县| 平安县| 蓝田县| 万山特区| 高州市| 长兴县| 海林市|