第 十四章 非同步處理

2021-08-15 02:04:05 字數 3694 閱讀 9144

servlet 不是單例, 但在同一伺服器的同一類請求中只會被建立一次.

servlet 的例項建立個數與一下條件有關:

1.是否部署在分布式環境中, 非分布式只會建立乙個例項

2.是否實現singlethreadmode 介面, 若實現, 同一 servlet 例項同一伺服器最多建立20個

3.在 web.xml中被宣告的次數, 若被宣告多次, 則會被多次建立例項

servlet容器預設是採用單例項多執行緒的方式處理多個請求的:

1.當web伺服器啟動的時候(或客戶端傳送請求到伺服器時),servlet就被載入並例項化(只存在乙個servlet例項);

2.容器初始化化servlet主要就是讀取配置檔案(例如tomcat,可以通過servlet.xml的設定執行緒池中線程數目,初始化執行緒池通過web.xml,初始化每個引數值等等。

3.當請求到達時,servlet容器通過排程執行緒(dispatchaer thread) 排程它管理下執行緒池中等待執行的執行緒(worker thread)給請求者;

4.執行緒執行servlet的service方法;

5.請求結束,放回執行緒池,等待被呼叫;

注意:避免使用例項變數(成員變數),因為如果存在成員變數,可能發生多執行緒同時訪問該資源時,都來操作它,造成資料的不一致,因此產生執行緒安全問題)

同一 servlet 同時要處理多個請求, 就需要產生執行緒, 非同步執行, 根據記憶體考慮, 在 tomcat7 中, 處理進來請求的最多執行緒數量為200.

servlet 或 filter 一直占用請求處理執行緒, 直到它完成任務, 如果任務耗時, 併發使用者的數量超出執行緒數量, 容器將會遇到超出執行緒的風險. tomcat 會將超出的請求堆放在乙個內部的伺服器 socket 中(其它容器可能不同). 如果繼續進來更多請求, 會被拒絕訪問, 知道有資源處理請求.

如果使用者需要在請求時非同步處理乙個長時間任務, 但使用者不必要知道任務執行的結果, 那麼直接提供乙個 runnable 給 executor, 並立即返回即可. 如果需要知道執行狀態結果就需要做一些處理了.

一 .編寫非同步的 servlet

webservlet 和 webfilter 註解型別可以包含 asyncsupport 屬性, web.xml 的配置也有 配置, 為了編寫支援非同步處理的 servlet 和 filter ,這個屬性必須為 true

支援非同步處理的 servlet 或 filter 可以通過 servletrequest 中呼叫 startasync 方法來啟動新的執行緒, z這個方法有兩個過載的方法

}呼叫asynccontext.dispatch("/index.jsp」);可返回jsp 頁面, 後面不需要寫 //        req.getrequestdispatcher(「index.jsp」).forward(req, resp);

如果用 req.getrequestdispatcher(「index.jsp」).forward(req, resp);req返回頁面, 頁面會重複獲取 el表示式內容, 並且無法獲取到執行緒內儲存的資訊

如果不想在任務完成之時分配給兩乙個資源, 也可以在 asynccontext中呼叫 complete 方法, 這個方法向 servlet 容器表名, 任務已經完成

非同步***

對於 servlet 或 filter 的非同步操作, 有乙個一步操作*** asynclistener 介面, 這個介面有四個方法

void oncomplete(asyncevent var1) throws ioexception;    //非同步操作完成

void ontimeout(asyncevent var1) throws ioexception; //非同步操作超時

void onerror(asyncevent var1) throws ioexception; //非同步操作失敗

void onstartasync(asyncevent var1) throws ioexception; // 執行緒剛剛啟動

asynclistener 沒有註解註冊監聽, 只能在 asynccontext 中新增註冊 listener 例項 如下

}其中要注意的是onstartasync,由於asynccontext是在servletrequest的startsync後才能獲取到,獲取後才能新增listener,所以第一次的onstartasync是不會被呼叫到的,但由於servletrequest的startsync可以多次呼叫,所以當下次startsync時,onstartasync才會被呼叫到。 (還沒搞定, 還是不呼叫)

第十四章約束

約束 constraint 是一種保證資料完整性的規則。約束設定在單個字段或者多個字段組合上,寫入這些欄位的行資料必須要符合約束的規則 約束的五種型別 not null 非空約束,指定某列的所有行資料不能包含空值 unique 唯一性約束,指定列或者列的組合的所有行資料必須唯一 primary ke...

第十四章 約束

第十四章 約束 練習1 1.學校有乙個選課系統,其中包括如下關係模式 系 系編號 主鍵,系名稱 唯一鍵,系主任 非空約束,系所在校去 取值範圍只能在南湖校區和渾南校區 create table xi xi no varchar2 10 primary key,xi name varchar2 10 ...

第十四章 集合

1.集合 把個數不定的物件一起帶著走 集合是乙個存放任意數量的引用的物件的容器 多個物件放在另乙個物件中,此物件可成為乙個集合物件 注意 如果集合物件建立時不指定泛型,則在當前集合中可以存放任意型別的物件 包括 collection list set map list 介面的實現類有arraylis...