【问题标题】:Concurrency in Java EE applicationJava EE 应用程序中的并发性
【发布时间】:2010-07-01 05:54:45
【问题描述】:

之前我问过这个问题: Read quicktime movie from servlet in a webpage? 基本上,我使用 servlet 将电影文件流式传输到浏览器上的 quicktime 插件(为了在根目录之外播放文件)。最后 Ryan Fernandes 向我询问了有关并发问题的问题。 我还没有真正得到这里的问题。

  • 使用 servlet 流式传输文件和传统方法之间的主要区别是什么 无论如何,服务器仍然必须将文件流式传输到客户端?如果不是,在后一种情况下,服务器实际上如何将文件流式传输到插件?

  • Ryan 还询问了使用 servlet 的性能。因为它占用了很多内存?当我们使用backing bean或者jsf、jsp(基于servlet)的时候,如果很多用户同时访问,创建的实例数量是巨大的。它还需要大量内存,我们如何解决它?

请帮助我解决这些问题。如果你有关于这些问题的好文章:并发,多线程,性能可以和我分享,我是新手。 非常感谢你。 问候 K.

【问题讨论】:

    标签: java performance servlets jakarta-ee concurrency


    【解决方案1】:

    好吧,如果你的意思是这个评论:

    您希望这个 servlet 并发服务多少用户?是 您确定创建 Fileinputstream 的 I/O 正在运行 处理多个并发请求?

    那么他的意思是,如果您尝试手动打开具有 100 个单独线程的同一个文件,可能会出现问题。

    网络服务器如何处理这种情况应该不会真的给您带来麻烦,因为他们可以以任何他们想要的方式实现它。

    关于主要问题,这是我在 javadoc 中找到的内容:

    class FileInputStream
    public FileChannel getChannel()
    

    返回与此文件输入流关联的唯一 FileChannel 对象。

    class FileChannel
    

    文件通道可供多个并发线程安全使用。按照 Channel 接口的规定,可以随时调用 close 方法。在任何给定时间,只有一项涉及通道位置或可以更改其文件大小的操作正在进行;在第一个操作仍在进行时尝试启动第二个此类操作将阻塞,直到第一个操作完成。其他操作,特别是那些采取明确立场的操作,可以同时进行;他们是否真的这样做取决于底层实现,因此未指定。

    【讨论】:

    • 嗨 Max,所以这里的问题是管理读取文件的并发性,而不是使用 servlet 对吗?
    • 是的,您指出的评论是指文件读取并发问题。并且使用 FileInputStream 可以完美解决,正如您从 javadoc 中看到的那样。
    • 谢谢马克斯。你是对的。我发现 servlet 能够处理并发请求
    【解决方案2】:
    • Web 服务器是为提供文件而构建的。这是Web服务器的主要功能。它为此进行了优化。你必须问自己:为什么不把这个 filename.mov 文件放在服务器的某个地方,让服务器流式传输呢?根本没有java,只有http://myserver.com/static/filename.mov。当然,这并不总是一种选择,但我猜 Ryan 是在问你是否考虑过。

    • 我在您的代码中没有发现任何并发问题。所有变量都是本地的,每个线程都会有自己的输入和输出流。但同样的论点也适用于这里:为什么不让 Web 服务器处理它呢?他们认为擅长为多个客户提供相同的文件。

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2021-10-25
      • 1970-01-01
      • 2013-06-15
      • 2013-09-27
      • 1970-01-01
      相关资源
      最近更新 更多