真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Tomcat的Session持久化策略是什么

Tomcat的Session持久化策略是什么,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

潁上網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)成立與2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

關(guān)于Tomcat的Session,我們都知道默認(rèn)是保存在內(nèi)存中。為了解決重啟應(yīng)用服務(wù)器Session丟失的問(wèn)題,Tomcat內(nèi)部的StandardManager會(huì)在正常的關(guān)閉時(shí)鈍化活動(dòng)的Session 并在重啟的時(shí)候重新加載。

而Tomcat在StandardManager之外,還提供了對(duì)應(yīng)持久化Session的Manager實(shí)現(xiàn): PersistentManager,目前對(duì)應(yīng)的有兩種持久化的實(shí)現(xiàn)

  • FileStore

  • JDBCStore

分別是將活動(dòng)的Session保存在磁盤上和保存到數(shù)據(jù)庫(kù)中。

本次我們以FileStore為例,來(lái)分析下PersistentManager在Tomcat中的實(shí)現(xiàn)。

配置

PersistentManager的配置基本上是這樣的:

      

對(duì)于FileStore和JDBCStore,基本配置都類似,有差異的只是Store中對(duì)應(yīng)的具體屬性,比如JDBCStore需要額外指定數(shù)據(jù)的用戶名和密碼等。上面的配置可以直接 用于FileStore。

其中,像maxIdleBackup、maxIdleSwap、minIdleSwap默認(rèn)都是關(guān)閉的,默認(rèn)值都是-1。當(dāng)然,我們上面的配置是修改過(guò)的。默認(rèn)的行為會(huì)和StandardManager一致,即在關(guān)閉重啟時(shí)進(jìn)行Session的鈍化和解析。

而當(dāng)按照我們上面的配置啟動(dòng)Tomcat后,服務(wù)器會(huì)根據(jù)maxIdleBackup的時(shí)間,以秒為單位,進(jìn)行空閑Session的持久化。在配置的目錄中,會(huì)生成以sessionId為文件名.session的文件

例如:5E62468BFF33CF7DE28464A76416B85E.session

主要參數(shù)說(shuō)明: 

  • saveOnRestart -當(dāng)服務(wù)器關(guān)閉時(shí),是否要將所有的session持久化; 

  • maxActiveSessions - 可處于活動(dòng)狀態(tài)的session數(shù); 

  • minIdleSwap/maxIdleSwap -session處于不活動(dòng)狀態(tài)最短/長(zhǎng)時(shí)間(s),sesson對(duì)象轉(zhuǎn)移到File Store中;

  •  maxIdleBackup -大于這一時(shí)間時(shí),會(huì)將session備份。

寫文件:

public void save(Session session) throws IOException {        // Open an output stream to the specified pathname, if any        File file = file(session.getIdInternal());        if (file == null) {            return;        }        if (manager.getContext().getLogger().isDebugEnabled()) {            manager.getContext().getLogger().debug(sm.getString(getStoreName() + ".saving",                             session.getIdInternal(), file.getAbsolutePath()));        }         try (FileOutputStream fos = new FileOutputStream(file.getAbsolutePath());                ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(fos))) {            ((StandardSession)session).writeObjectData(oos);        }    }

我們來(lái)看load操作,和StandardManager加載Session基本一致,先創(chuàng)建空的session,再readObjectData:

    public Session load(String id) {        File file = file(id);        Context context = getManager().getContext();        try (FileInputStream fis = new FileInputStream(file.getAbsolutePath());                ObjectInputStream ois = getObjectInputStream(fis)) {             StandardSession session = (StandardSession) manager.createEmptySession();            session.readObjectData(ois);            session.setManager(manager);            return session;        } catch (FileNotFoundException e) {            return null;        }    }

刪除操作:

public void remove(String id) throws IOException {    File file = file(id);    file.delete();}

而這些load,remove等操作的觸發(fā)點(diǎn),就是我們之前提到過(guò)的后臺(tái)線程:我們?cè)谇懊娣治鲞^(guò)期的session是如何處理的時(shí)候,曾提到過(guò),可以移步這里:對(duì)于過(guò)期的session,Tomcat做了什么?

都是使用backgroundProcess

public void backgroundProcess() {    count = (count + 1) % processExpiresFrequency;    if (count == 0)        processExpires();}

PersistentManager的processExpires方法中,重點(diǎn)有以下幾行

        processPersistenceChecks();        if (getStore() instanceof StoreBase) {            ((StoreBase) getStore()).processExpires();        }

其中在processPersistenceChecks中,就會(huì)對(duì)我們上面配置的幾項(xiàng)進(jìn)行檢查,判斷是否要進(jìn)行session文件的持久化等操作

/** * Called by the background thread after active sessions have been checked * for expiration, to allow sessions to be swapped out, backed up, etc. */public void processPersistenceChecks() {     processMaxIdleSwaps();    processMaxActiveSwaps();    processMaxIdleBackups(); }

此外,通過(guò)配置pathname為空,即可禁用session的持久化策略,在代碼中,判斷pathname為空時(shí),不再創(chuàng)建持久化文件,從而禁用此功能。

  

總結(jié)下,正如文檔中所描述,StandardManager所支持的重啟時(shí)加載已持久化的Session這一特性,相比PersistentManager只能算簡(jiǎn)單實(shí)現(xiàn)。要實(shí)現(xiàn)更健壯、更符合生產(chǎn)環(huán)境的重啟持久化,最好使用PersistentManager并進(jìn)行恰當(dāng)?shù)呐渲谩?/p>

看完上述內(nèi)容,你們掌握Tomcat的Session持久化策略是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


網(wǎng)站題目:Tomcat的Session持久化策略是什么
文章位置:http://weahome.cn/article/jppipp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部