2013-05-03 103 views
1

使用Java EE我需要使用有狀態會話Bean。有狀態會話bean忘記值

@Stateful 
@TransactionManagement(TransactionManagementType.BEAN) 
public class FacadeExercice extends AbstractFacade<EntityBeanExercice> 
    implements IFacadeExercice { 

@PersistenceContext(unitName = "GestionCours-ejbPU") 
private EntityManager em; 
@Resource 
private UserTransaction transaction; 
private int lastChange; 
private int connections; 

[...] 

@Override 
public EntityBeanExercice find(Object id) { 
    EntityBeanExercice ex = null; 
    connections += 5; 
    try { 
     transaction.begin(); 
     ex = super.find(id); 
     lastChange = ex.getLastChange(); 
     transaction.commit(); 
    } catch (Exception ex1) { 
     Logger.getLogger(FacadeExercice.class.getName()).log(
      Level.SEVERE, null, ex1); 
    } 
    return ex; 
} 
} 

但每次我在我的豆進入時,connections變量設置爲0。

我不知道我在哪裏可以尋找一個解決方案。

回答

2

這個問題可以在這些情況下出現:

  • 一個SFSB的壽命被連接到它的客戶機的壽命。

如果您有命令行客戶端,例如您的SFSB工作正常。當命令行應用程序終止時,SFSB也會被刪除。

如果SFSB由JSP/servlet使用,例如,當HTTP請求完成時,它的生存期結束。如果要在HTTP請求中生存下來,則必須將其置於HTTP會話中:在從JNDI查找中獲得實例後,應將該實例作爲HttpSession中的一個屬性。下一個使用此SFSB的HTTP請求必須從HttpSession獲得句柄。

  • 每個JNDI查找返回一個新的實例

EJB 3.1, 4.6 Stateful Session Bean State Diagram

當有狀態會話bean查找或以其它方式獲得通過明確 JNDI查找機制報價,容器必須提供一個新的有狀態會話bean實例,作爲 所需的Java EE規範(「Java命名和目錄接口(JNDI) 命名上下文「[12])。

因此,您不應該多次查找SFSB。

相關問題