2011-08-28 65 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

相关问题