在Component-Base和N-Tier潮流下,無狀態(stateless)物件扮演著重要的角色。stateless物件是 OO 和Transaction Service兩項技術結合的產物。OO 技術強調的是彈性(felxibility)、重用性(reusability)和分散性(distribution),Transaction Service技術強調的是效率(performance)和延展性(scalability)。 Stateless物件是這兩項技術結合的重要支柱。
傳統的OO技術大多著重於 Stateful 物件,然而在今天的MiddleWare(如EJB和 COM+/MTS)裡面,Stateless物件的地位卻遠遠高於Stateful物件。尤其是在EJB的架構裡,Stateless有著非常重要的用途。例如Stateless的Session物件不需要長期保存自身的狀態值,也不專屬於特定的用戶(client),所以占用的服務器資源非常之少,也由於不隸屬於特定的用戶,所以許多EJB物件可以共用少數的Stateless物件。
Stateless物件的特性
就Client而言,在意的是server物件的外在行為,而行為又和物件的狀態無關。所以client物件不必在意物件狀態的變化,而不是此 種物件真的沒有狀態。比如說stateless的限制並不意味著stateless的session beans不能擁有屬性變量,所以,這些session beans一樣會擁有自己的內部狀態,然而重要的是,client不會看到這些內部狀態。
在Internet時代裡,資訊系統的擴展性(scalability)顯得無比重要,而高度擴展性的前提是必須有效運用Server的資源,而無狀態的物件的資源共用性極大地減少了服務器的負載,因此,在開發N-Tier系統的時候,活用Stateless物件是系統開發人員必須具有的技能之一。
使用Stateless支持交易
當企業資訊系統的Client數目大幅度增加的時候,每個Client能夠享有的共用資源(shared resources)自然會更加稀少。面對這個問題,除了投入更多的資源之外,好好協調以避免資源的浪費,達到充分共享,也是重要的解決之道。
其中,數據庫是最典型的稀有共享資源,交易是協調這項共享資源的可靠技術,如果加上Stateless物件,交易就會更加具有威力--更有效運用數據庫的connection,並能跨越不同的數據庫(即分布式交易)。
交易是商業往來或異動的事件(event) 。事件一旦發生,企業資訊系統就會參與進行一連串的作業過程(process),在這個過程中,會導致共享資源(比如數據庫的資料)的一連串異動。為了確保在異動過程中,不受到別的交易的干擾,也為了確保異動過程中的例外處理(比如roll back),“交易”就成為用來管理和協調共用資源的工具。
在交易過程中,需要數據庫提供服務(即資源),以便能夠異動數據庫裡面的資料,完畢後就把資源釋放,供彼得交易使用。在像EJB等系統的交易服務(transaction service)裡 ,都必須具備有ACID(atomic,consistency,isolation,duration)四個特性,來做到上述的資源管理功能。
一般來說,必須先取得和數據庫的溝通管道(connection) ,才能獲得數據庫的服務,而數據庫的connection又很有限,所以協調connection成為管理數據庫資源的重心。讓每個client能盡快釋放connection成為重要的管理工作。
在交易的進行過程中,會取得所需的數據庫連接,一直到交易結束才會釋放掉,所以充分運用連接一定要注意兩點,一是交易的時間越短越好,交易越短就能越快速地釋放被占用的connection。二是交易所需要的connection越少越好,這樣就有更多的共享機會了。
在component-based環境中,一個交易通常由一群物件所共同合作,每個物件可能由不同人所設計開發,每個物件也都可能向數據庫索取connection。如果一個交易的參與物件越多,而且每個物件占用的connection時間越長,則這個交易就需要足夠多的connection才能完成任務。
因此,“讓物件迅速釋放connection” 是提升數據庫資源運用效率的重要策略,stateless物件則是實現這個策略的重要技術。