如何让Glassfish不为每个请求创建新会话?

时间:2011-08-28 21:45:40

标签: glassfish ejb java-ee-6 jax-rs ejb-3.1

Glassfish 3.1.1 泽西岛1.8

我将以下无状态会话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开始)。会话现在过期,可以快速收集垃圾,以防止服务器内存不足。 glassfish监控部分的“Web容器:会话统计”显示我有~50,000个活动会话。

1 个答案:

答案 0 :(得分:2)

  

为每个请求创建会话

你的意思是为每个请求创建一个新的无状态会话bean实例吗?如果是这样,如果您不希望这种情况发生,您可以使用@Singleton注释会话bean。

此外,如果公开的服务是只读的,您可以使用@javax.ejb.Lock(READ)对其进行注释,以提高并发性和性能。

最后,如果您不想使用单例但希望限制容器创建的实例数,请查看池大小设置:http://download.oracle.com/docs/cd/E18930_01/html/821-2418/beahx.html