我在Weblogic上有一个Jax-RS Jersey Web服务。它运行正常,但返回大量数据。问题是如果我在服务器上耗尽所有JVM内存的同时有更多4次调用服务,那么一切都停止工作,我必须重新启动。
如何将服务限制为仅运行2个或3个实例并让其他呼叫等待?
答案 0 :(得分:0)
您如何归还数据?你是否创建了整个对象以便在内存中返回?如果是这样,那么您可能希望调查流式传输响应。
您能告诉我们您的服务在做什么吗?
编辑:
您可以像这样流式传输内容(例如来自ResultSet
的数据);
@GET
public MyResultStream getData()
{
ResultSet rs = queryDatabase();
return new MyResultStream(rs);
}
您需要自己提供MyResultStream;
public class MyResultStream implements javax.ws.rs.core.StreamingOutput
{
private ResultSet rs;
public MyResultStream (ResultSet rs)
{
this.rs = rs;
}
public void write(OutputStream output)
{
//write any document pre-able
// for example <results>
while (rs.next())
{
//get the data from the ResultSet and write it to the output in XML form
// for example <result><foo>bar</foo></result>
}
//write any document post-amble
// for example </results>
}
}
请记住,您必须以某种方式关闭ResultSet
。
答案 1 :(得分:0)
如果你只用三或四个请求来崩溃JVM,那么我可能会开始考虑所做的工作的架构。正如Qwerky所说,你是在创造你要归还的所有物体吗?这些物体很重吗?您可以使用较轻的对象来返回数据吗?您是否必须立即返回所有数据?您可能返回多少(记录/对象的数量)数据?有多大(KB,MB等大小)?服务器有足够的内存吗?服务器的最小和最大内存是否在启动时设置为有助于其更好地运行的值?有泄漏吗?我是否在堆上创建了太多的对象?
等待它本身不是应用程序的东西,集群和负载平衡(分散请求)。
另外......取决于您返回的数据量...有时候,Web服务不是一件好事。在我的公司,我们遇到了一个案例,我们试图开发一个需要处理大约30K行数据的Web服务。它只是为了处理它。实际上,我们最终将该流程转变为批处理流程。然后,我们的Web UI和Web服务使用该过程的结果。由于用户在第二天之前不需要数据,因此只是更容易管理数据处理。
只是一些不同的想法可以帮助你找到一些不同的角度来实现这个目标。