2011-08-28 75 views
0

Glassfish 3.1.1 Jersey 1.8如何讓Glassfish爲每個請求創建新會話?

我有以下無狀態會話bean作爲JAX-RS資源公開。 VehicleResource包含在WAR中,其他EJB包含在EJB-JAR中。整個應用程序打包並部署爲EAR。

@Stateless 
@Path("/") 
@DeclareRoles({"production"}) 
public class VehicleResource { 

private static final Logger logger = Logger.getLogger(VehicleResource.class.getName()); 
private static final long serialVersionUID = 1L; 

@Context 
private UriInfo uriInfo; 

@EJB 
private VehicleManagementLocal vehicles; 

@EJB 
private VehicleAliases aliases; 
.... 

我有一個澤西島客戶向寧靜的服務提出請求。會話是爲每個請求創建的。這是正常的/預期的嗎?有很多請求,服務器很快就會耗盡內存。爲什麼會發生這種情況,並且是否有任何配置/代碼更改可以阻止每個請求的新會話?

編輯 實際上,只創建了一個會話bean實例。我通過反覆點擊一個URI來模擬一個負載。我已將會話超時更改爲5分鐘(從30開始)。會話現在到期,可以快速收集垃圾,以防止服務器內存不足。玻璃魚監測部分的「Web容器:會話統計」顯示我有約50,000個活動會話。

回答

2

會話爲每個請求創建

你的意思是無狀態會話bean的新實例爲每個請求創建?如果是這樣,並且您不希望發生這種情況,您可以使用@Singleton註釋會話bean。

另外,如果公開的服務是隻讀的,則可以使用@javax.ejb.Lock(READ)對其進行註釋以提高併發性和性能。

最後,如果你不想使用單,但要限制實例數量的容器創建你看看池的大小設置:http://download.oracle.com/docs/cd/E18930_01/html/821-2418/beahx.html

+0

我幾乎鍵入相同的答案,但開始思考關於設計的不安如何創造一個新線索。游泳池耗盡且下一次請求進入時會發生什麼?客戶看到什麼? – Preston

+0

當池耗盡時,容器會等待更長時間,以便將未使用的實例返回到可用於提供請求的池中。但是,如果容器找不到這樣的實例,例如30秒(這是可配置的),它將超時並且請求將不會被提供。 – Behrang

+0

客戶端是否收到404錯誤或其他內容? – Preston

相關問題