如何防止Glassfish为每个请求创建新会话?

如何防止Glassfish为每个请求创建新会话?,glassfish,ejb,java-ee-6,jax-rs,ejb-3.1,Glassfish,Ejb,Java Ee 6,Jax Rs,Ejb 3.1,玻璃鱼3.1.1 泽西1.8 我将以下无状态会话bean公开为JAX-RS资源。VehiclerResource包含在WAR中,其他EJB包含在EJB-JAR中。整个应用程序打包并部署为EAR @Stateless @Path("/") @DeclareRoles({"production"}) public class VehicleResource { private static final Logger logger = Logger.getLogger(VehicleResource

玻璃鱼3.1.1 泽西1.8

我将以下无状态会话bean公开为JAX-RS资源。VehiclerResource包含在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;
....
我有一个Jersey客户请求restful服务。为每个请求创建一个会话。这正常吗?对于许多请求,服务器很快就会耗尽内存。为什么会发生这种情况,我是否可以对配置/代码进行任何更改,以防止每个请求都有新的会话

编辑 实际上,只创建了会话bean的一个实例。我通过反复点击URI来模拟负载。我已将会话超时更改为5分钟(从30分钟更改为5分钟)。会话现在过期,可以足够快地进行垃圾收集,以防止服务器内存不足。glassfish监控部分中的“Web容器:会话统计”显示我有约50000个活动会话

为每个请求创建一个会话

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

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


最后,如果您不想使用singleton,但想限制容器为您创建的实例数量,请查看池大小设置:

我几乎键入了相同的答案,但开始考虑如何通过设计创建新线程。当池耗尽并且下一个请求进入时会发生什么?客户端看到了什么?当池耗尽时,容器会等待更长的时间,以便将一个未使用的实例返回到池中,该实例可用于服务请求。但是,如果容器在30秒(这是可配置的)内找不到这样的实例,它将超时,请求将不会被提供。请参阅对原始问题的编辑。谢谢你关于锁的提示(阅读),我会查出来的。我在这里可能完全不靠谱,但我认为Servlet可以在不创建会话的情况下处理许多连接。我想象如果我使用servlet,我会失去EJB注入的好处。我想知道是否可以将web会话注入VehicleSource EJB并在每个方法中使其无效?