不可不說
          隨心所欲,無往不利!
          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 藍劍 閱讀(1240) 評論(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)

          相冊

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 325306
          • 排名 - 172

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 米易县| 蒲江县| 隆化县| 孟村| 游戏| 介休市| 黑山县| 景宁| 古田县| 嫩江县| 明溪县| 宜州市| 芦溪县| 交口县| 格尔木市| 长沙县| 吉木乃县| 西林县| 枣强县| 利辛县| 香港| 仪征市| 金沙县| 囊谦县| 成安县| 隆化县| 新巴尔虎右旗| 蒙山县| 三原县| 孟连| 西城区| 盐津县| 六盘水市| 晋宁县| 焦作市| 宜州市| 浙江省| 尉犁县| 曲靖市| 灯塔市| 山阳县|