Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          Resin 跨服務器的session傳遞[zhuan]

          Resin 跨服務器的session傳遞

          --By oldjavaman

           http://blog.csdn.net/oldjavaman/archive/2009/07/10/4338315.aspx

          1.   基于文件的session持久化技術

          Seesion能夠被跨服務器持久化, 包含我們的web應用的Class發生變化, 譬如在開發期間,使用基于文件的持久化Seesion技術是非常便捷的, 尤其是我們在開發時, 當Servlet會發生經常變化

          在resin.conf中配置如下

          <web-app xmlns="http://caucho.com/ns/resin">  <session-config>    <file-store>WEB-INF/sessions</file-store>  </session-config></web-app>

          這樣的配置是將Session寫在一個在<file-store>中定義的文件目錄中,當Session發生變化時,將會把session寫入一個文件, 當web應用被加載時, resin會從文件里面加載session

          但是,基于文件的session技術在做跨服務器的session傳遞時是沒有作用的,有人提出使用NFS技術, 在多個服務器之間共享這個session持久文件, 但是NFS往往會從本地調用緩存, 這樣一來, 實際存放session的文件發生變化時,不能及時在另一臺服務器上得到體現

          2.   分布式session
          分布式session比文件持久session復雜得多, 文件持久session是一個簡單的基于內存的session管理, 但是分布式session必須事先在多臺服務器之間實現session變化的傳遞

          多臺機器的負載均衡, 使用的session技術不外乎sticky sessions (粘性session)或者symmetrical sessions(對稱session)。前者關注的是負載均衡技術, 后者是關注JVM的技術。使用何種技術依賴于你有什么樣的硬件,多少臺機器,你要如何管理session.

          2.1.      對稱session
          對稱session技術多用于負載均衡,一個session可以從A機器中取出,存放在B機器里面,采用JDBC session技術的對稱session ,需要描述resin.conf中的“always-load-session”屬性。 每個請求都獲得最新狀態的session

          對于對稱的session來說, 一個完全一致的服務器環境是他可以工作的基礎,所以較粘性session來說, 由于它每次web請求都需要更新session信息, 所以比較低效。

          2.2.      粘性session
          粘性的session依賴JVM來實現, 只要session開始工作,那么負載均衡將永遠把相同的session存放于同一個機器上, 舉個例子來說,有一個ID為aaaXXX的session永遠放在A機器的JVM-A上, 而bbbXXX的session用于放在B機器的JVM-B上。

          使用這種技術的是比較可靠的, 如果A機器宕機, 則可以從B機器上取得我們需要的session, 而使用者并無從查覺,另外使用粘性session是高效率的,只有session發生變更時才需要重寫到服務器。

          2.3.      always-load-session
          正如上文提及的對稱式的session技術需要使用<always-load-session>屬性來標識是否每個請求都要從服務器更新session, 如果使用的是jdbc-session技術, 那么這個標識是一定要在配置文件中加上的, 但是如果是基于tcp-session技術的話, 可以不用標識, 因為tcp-session的技術更為老練一些。

          always-save-session屬性強制了客戶的每次web請求需要從服務器的session存儲中獲得更新,默認情況,用戶只有在創建session才從服務器持久層取得session,但是使用了多個服務器的話, 就需要標識來強制每個請求都從服務器持久層取得session來保證每個服務器的session是一致的。

          2.4.      always-save-session
          默認情況, 當session發生變化時Resin會將session寫入到服務器, 如:你在程序中調用了setAttribute()方法,但是假設你僅僅是更新了session中的對象的一個屬性, 譬如存放的是一個用戶對象, 你改變了這個用戶對象的年紀, 這個時候resin并不能偵測到session的變化,也不會保存這個變化。

          使用<always-save-session >屬性, 可以確保在客戶么個請求結束后, 都會在服務器保存session的變化, 盡管低效, 但是非常可靠。

           

          3.   基于數據庫的session同步技術
          基于數據庫的session技術非常容易理解, resin把session寫入到數據庫中, 每次請求session從數據庫中來獲得。

          為了效率的考慮, jvm所在機器必須保存session的緩存,只有當session發生變化時,這個機器才會向數據庫重新查詢,如果另一個jvm里面的代碼改變了session,將會通知這個機器向數據庫請求獲得更新。

          這樣的數據庫同步技術會導致向一個已經存在session的機器分發變更了的session數據,這樣數據庫可能會成為瓶頸, 為了解決這樣的問題, 采用便捷輕巧的mysql來存儲session,使用Oracle來存放業務數據是一個不錯的主意。

          使用數據庫技術<database>屬性是必須的, 加上這個屬性,resin會自動在制定數據庫上創建session存儲的表

          <resin xmlns="http://caucho.com/ns/resin"><server>  <http id='a' port='80'/>  <http id='b' port='80'/>   <database jndi-name="jdbc/session">    ...  </database>   <cluster>    <srun id='a' host='host-a' port='6802'/>    <srun id='b' host='host-b' port='6802'/>  </cluster>   <persistent-store type="jdbc">    <init>      <data-source>jdbc/session<data-source>    </init>  </persistent-store>  ...   <web-app-default>    <session-config>      <use-persistent-store/>    </session-config>  </web-app-default>
           

          持久化的session必須在上文的<sever>中使用<persistent-store>來定義。而每一個web-app應用必須使用<use-persistent-store/>來表示需要分布式session技術

          ata-source
           數據源
           
          table-name
           存放session數據的表名
           
          blob-type
            Blob類型
           
          max-idle-time
            釋放時間
           

           

           

          CREATE TABLE persistent_session (

            id VARCHAR(64) NOT NULL,

            data BLOB,

            access_time int(11),

            expire_interval int(11),

            PRIMARY KEY(id)

          )
           

          下面是一個使用持久層session的web-app定義示例:

          <web-app xmlns="http://caucho.com/ns/resin">  <session-config>    <use-persistent-store/>    <always-save-session/>  </session-config></web-app>

          4.   基于集群session技術
          基于集群的session技術應用在服務器集群領域, 在一些案例中采用數據庫的session分布技術是高效的, 有些場合,采用集群的session是高效的。

          在集群的session每一個服務器擁有一個jvm和一個備份jvm, session同時保存在自己的jvm和備份jvm里面。

          同樣地, 你必須修改<sever>中的<cluster>下面的<srun>屬性來達到集群session的效果, 在web-app中使用<use-persistent-store>屬性來標識這個應用采用session持久化技術

          配置如下:

          <resin xmlns="http://caucho.com/ns/resin">

            ...

           

          <server>

            <cluster>

              <srun id="a" host="192.168.0.1" port="6802" index="1"/>

              <srun id="b" host="192.168.0.2" port="6802" index="2"/>

            </cluster>

           

            <persistent-store type="cluster">

              <init path="cluster"/>

            </persistent-store>

            ...
           

           

          <web-app xmlns="http://caucho.com/ns/resin">  <session-config>    <use-persistent-store="true"/>  </session-config></web-app>
           

          <srun>和<srun-backup>都被視為一個集群服務器, 當一個服務器上的session發生變化時, 它會自動尋找其他的備份服務器, 并把備份服務器上的session更新, 當這個服務器重新啟動時, 他會向備份服務器請求session,并獲得備份。

          <resin xmlns="http://caucho.com/ns/resin"><server>  <http id='a' port='80'/>  <http id='b' port='80'/>   <cluster>    <srun id='a' host='host-a' port='6802'/>    <srun id='b' host='host-b' port='6802'/>  </cluster>   <persistent-store type="cluster">    <init path="cluster"/>  </persistent-store>   <host id=''>  <web-app id=''>   <session-config>    <use-persistent-store="true"/>  </session-config>   </web-app>  </host></server></resin>
           

           

           

           

           

           
           
          5. 關于作者
          OldJavaMan,長期致力于Java相關領域的技術工作, 主要參與J2EE相關程序的設計, 目前在南京的一家軟件企業就職,他希望和廣大的Java愛好者結交朋友。大家可以通過 mail 聯系他 。

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/oldjavaman/archive/2009/07/10/4338315.aspx

          posted on 2009-08-02 21:50 都市淘沙者 閱讀(923) 評論(0)  編輯  收藏 所屬分類: Tomcat/Weblogic/Resin/Jboss

          主站蜘蛛池模板: 收藏| 福泉市| 哈密市| 木里| 德格县| 泰州市| 夏邑县| 云霄县| 北流市| 隆子县| 武乡县| 綦江县| 武隆县| 玛多县| 丘北县| 中江县| 高青县| 淮安市| 新竹县| 留坝县| 驻马店市| 新营市| 雷州市| 甘南县| 保定市| 合川市| 永康市| 定安县| 昌图县| 遂平县| 称多县| 开鲁县| 辰溪县| 乐至县| 清苑县| 巴林右旗| 安乡县| 龙门县| 内江市| 赤水市| 正宁县|