2011-06-16 63 views
4

上午通過企業會話bean去material.i有疑惑就低於oints: -狀態會話bean池的大小

1)可以說,我們提到的池大小爲50對一些statful會話bean。不同的50個客戶使用它們。 所以現在所有的50個豆都保持着某種狀態。在什麼時候這些狀態會被移除,這樣如果第51個客戶請求bean,它就不會得到任何先前被破壞的狀態。

2)可以說我們提到池的大小爲50對於某些無狀態會話bean,並且全部都在使用某個 時間點。如果第51個客戶端來請求一個bean,那麼等到某個bean變成空閒的時候 還是創建新的bean實例?

+0

這是所有供應商特定的。你正在使用哪個EJB容器?我建議在問題中添加「glassfish」,「openejb」,「weblogic」,「websphere」等標籤。 – 2011-06-16 22:06:44

回答

5

有狀態會話bean通常不會合並。這是可能的,但是他們的狀態使他們不太理想,因爲在獲得參考時,客戶期待新鮮豆子。

對於無狀態bean,是的,第51個客戶端將不得不等待。這通常是一件好事,因爲它會自動調節系統的資源消耗。根據您擁有的資源,工作負載以及單次調用ssb的工作量,您可能需要調整池的大小。

+0

感謝Mike在上面提出了另一個問題,我們是否提到特定bean的池大小,還是應用程序中所有無狀態會話bean的集合?當這些實例被添加到池中時。當請求進入服務器或啓動服務器時會發生嗎? – 2011-06-17 07:51:02

+0

可以爲單個bean設置實例池大小。您不知道何時將實例添加到池中,但通常需要無狀態會話Bean。對於單例會話bean,您可以使用註釋來表示您希望在服務器啓動時創建bean。 – akira 2011-06-17 09:30:39

5

由於bkail聲明@Stateless bean的池化語義是特定於供應商的。也就是說在EJB 3.1中我們添加了@AccessTimeout註釋,該註釋可以用於豆類或@Stateless,@Stateful@Singleton bean的方法。

@AccessTimeout

在一般意義上,這批註便攜指定了多久,如果等待條件與併發訪問時主叫方將等待。具體到每個bean的類型,等待何時將發生的條件:

  • @Singleton - 一個@Lock(WRITE)方法被調用並且正在使用容器管理併發。所有方法默認爲@Lock(WRITE)
  • @Stateful - 調用實例的任何方法併發生第二次調用。或者@Stateful bean在一個事務中,調用者從該事務之外調用它。
  • @Stateless - 池中沒有實例可用。但是,正如所指出的那樣,彙集語義,如果有的話,不包括在規範中。如果供應商的池語義確實包含等待條件,則應該使用@AccessTimeout。

用法

@AccessTimeout是簡單地圍繞java.util.concurrent API中常用longTimeUnit元組一個方便的包裝。

import java.util.concurrent.TimeUnit; 
@Target({METHOD, TYPE}) 
@Retention(RUNTIME) 
public @interface AccessTimeout { 
    long value(); 
    TimeUnit unit() default TimeUnit.MILLISECONDS; 
} 

當一個bean類或方法明確設置,它有三個可能的含義:

  • @AccessTimeout(-1) - 從不超時,等待,只要它需要。可能永遠。
  • @AccessTimeout(0) - 永不等待。如果發生等待情況,立即拋出ConcurrentAccessException
  • @AccessTimout(30, TimeUnit.SECONDS) - 如果發生等待情況,最多等待30秒。在此之後,扔ConcurrentAccessTimeoutExcpetion

沒有標準的默認

注意,value屬性沒有缺省。這是故意的,意在表明如果@AccessTimeout未明確使用,您獲得的行爲是特定於供應商的行爲。

一些供應商會等待預先配置的時間並拋出javax.ejb.ConcurrentAccessException,一些供應商會立即拋出它。當我們定義這個註釋時,很明顯,我們所有的供應商都在做一些不同的事情,強制執行默認會導致現有應用程序出現問題。

在類似的說明中,在EJB 3.0之前,沒有默認的事務屬性,它對每個供應商都不同。謝天謝地,EJB 3.0已經不同了,我們終於可以說:「對於EJB 3.0 bean,默認值是必需的。」