【问题标题】:How to improve file IO performance in a rest service如何在 rest 服务中提高文件 IO 性能
【发布时间】:2019-04-18 20:28:34
【问题描述】:

我手头的场景来自我的spring boot rest服务,从资源文件夹中读取一个word doc并将字节数组传递给客户端

我使用 FileInputStream 读取内存中的单词 doc,使用 Apache Common IO IOUtils 将输入流转换为字节数组并将其放置在 rest 服务的响应体中。

这里的问题是我总是在 memeirh oer 服务请求中读取文件,这对运行服务的进程的本地内存是有害的。

我无法逐行读取文件并以这种方式将其返回给服务调用者,因为我需要将字节数组一起返回给调用者

我预见到的另一个问题是如何读取文件。我想做一个非阻塞 IO 而不是阻塞 IO。

想知道什么是解决这个问题的有效方法

【问题讨论】:

    标签: java spring spring-boot file-io


    【解决方案1】:

    你真的需要在每次请求进入时读取文件吗?

    否则,您可以在服务器启动时读取文件,然后将文件保存在内存中存储在 Spring Bean 中。然后在每次调用时从那里获取它?

    【讨论】:

    • 我正在考虑在为字节数组提供服务后以某种方式将其从内存中逐出。不确定是否有办法做到这一点
    • 另外,我需要考虑一个文档可能经常更改的场景。因此,在启动时在春季 IOC 中加载它可能无法正常工作,因为必须为每个请求提供新的文档
    • 取决于文档将如何更改。如果文件上传了,你可以上传到服务器,服务器写入文件但将文件保存在内存中。然后它可以从内存中提供文件。如果服务器重新启动,它只会在启动时从磁盘加载文件。如果文件被放到一个文件夹中,如果文件被放到一个特定的文件夹中,您可以使用文件观察器来读取文件,然后将文件加载到内存中。
    【解决方案2】:

    如果您不想每次都上传文件,最好创建@Bean,在init/postconstruct 阶段进行。您还可以向您的retrieve() 方法添加一些功能,该方法通过调用File.lastModified() 来检查和存储文件修改时间,以决定您是否必须重新加载内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多