Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何构建单一访问web服务?_Java_Weblogic_Jersey_Jax Rs - Fatal编程技术网

Java 如何构建单一访问web服务?

Java 如何构建单一访问web服务?,java,weblogic,jersey,jax-rs,Java,Weblogic,Jersey,Jax Rs,我在Weblogic上有一个Jax RS Jersey web服务。它运行正常,但返回大量数据。问题是,如果在使用服务器上的所有JVM内存的同时,我有4个以上的服务调用,那么一切都停止工作,我必须重新启动 如何将服务限制为仅运行2或3个实例,并让其他呼叫等待?您如何返回数据?是否创建要返回内存中的整个对象?如果是这样的话,那么您可能希望转而研究响应流 你能告诉我们你的服务是什么吗 编辑: 您可以像这样流式传输内容(如结果集的数据) @GET public MyResultStream getDa

我在Weblogic上有一个Jax RS Jersey web服务。它运行正常,但返回大量数据。问题是,如果在使用服务器上的所有JVM内存的同时,我有4个以上的服务调用,那么一切都停止工作,我必须重新启动


如何将服务限制为仅运行2或3个实例,并让其他呼叫等待?

您如何返回数据?是否创建要返回内存中的整个对象?如果是这样的话,那么您可能希望转而研究响应流

你能告诉我们你的服务是什么吗

编辑:
您可以像这样流式传输内容(如
结果集的数据)

@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>
  }
}
公共类MyResultStream实现javax.ws.rs.core.StreamingOutput
{
私人结果集;
公共MyResultStream(结果集rs)
{
这1.rs=rs;
}
公共无效写入(OutputStream输出)
{
//写任何可以预先阅读的文件
//比如说
while(rs.next())
{
//从ResultSet获取数据,并以XML格式将其写入输出
//比如酒吧
}
//写任何文件后慢行
//比如说
}
}

请记住,您将不得不以某种方式关闭您的
结果集。

如果您仅使用三个或四个请求就使JVM崩溃,那么我可能会开始研究所做工作的体系结构。正如Qwerky提到的,您是否正在创建所有要返回的对象?那些东西重吗?您可以使用较轻的对象返回数据吗?您必须一次返回所有数据吗?您可能返回多少(记录数/对象数)数据?多大(大小以KB、MB等为单位)?服务器是否有足够的内存?服务器在启动时的最小和最大内存是否设置为有助于提高性能的值?有漏洞吗?我是否在堆上创建太多对象太快

而且,它与应用程序本身无关,那么集群和负载平衡(分散请求)又如何呢

另外…取决于返回的数据量…有时web服务不是一件好事。在我的公司,我们有一个案例,我们试图开发一个web服务,它需要处理大约3万行的数据并发送回。这件事太难处理了。实际上,我们最终把这个过程变成了一个批处理过程。该过程的结果随后被我们的web UI和web服务使用。因为用户直到第二天才需要数据,所以它只是让管理数据处理变得更容易


只是一些不同的想法可以帮助您从不同的角度来实现这一点。

添加了
weblogic
标记,因为解决方案可能(很可能)是特定于weblogic的(比如调优连接池)。它在大型机上读取db2,循环通过结果集来加载和对象。然后Jersey Jaxb将其转换为XML并返回。我正在从resultset构建一个list对象,然后返回整个对象。我让Jersey框架在我的list对象上使用Jaxb。我检查了日志,实际上需要大约8个请求才能杀死JVM。当它工作时,它返回大约20MB的数据,在大约3秒钟内以XML的形式返回。您是否使用+(加号)进行了大量的字符串浓缩?我们在我们的一个服务器应用程序中做了一些XML工作,并因此几乎杀死了服务器。我们忘记了字符串是不可变的,这让我们付出了沉重的代价。如果是,我建议切换到StringBuilder或StringBuffer。这可能是生成大量堆的原因。我正在通过resultset循环填充一个row对象,然后将该行添加到列表对象并返回列表对象。最小和最大堆设置是什么?可能堆的增长速度太快,无法进行初始化?在崩溃之前,堆的右边是什么?