【问题标题】:Should I close an S3Object?我应该关闭 S3Object 吗?
【发布时间】:2023-01-06 21:53:09
【问题描述】:

如果我没有关闭finally 子句中的s3object 怎么办?

下面的代码中没有资源泄漏吗?

class S3ClientClass {
  lazy val amazonS3Client = this.getS3Client()
  private def getS3Client() = {
    AmazonS3ClientBuilder
      .standard()
      .withRegion(Regions.AP_NORTHEAST_1)
      .build()
  }

  def readFromS3(s3Bucket: String, filepath: String): String = {
    var s3object: S3Object = null
    try {
      s3object = amazonS3Client.getObject(s3Bucket, filepath)
      readFromS3(s3object)
    }
    finally {
      if (s3object != null) {
        s3object.close()
      }
    }
  }
 
  def readFromS3(obj: S3Object): String = {
      val reader = new BufferedReader(new InputStreamReader(obj.getObjectContent))
      reader.lines().collect(Collectors.joining())
  }
}

【问题讨论】:

    标签: amazon-web-services scala aws-sdk aws-sdk-java-2.0


    【解决方案1】:

    如果你没有关闭S3Object,是的,它会导致资源泄漏。 S3Object类实现了Closeable接口,这意味着它应该被关闭以释放它持有的资源;在这种情况下,资源将是与 Amazon S3 的网络连接。

    这在AWS Developer Blog中也有解释:

    S3Object 包含一个 S3ObjectInputStream,它允许您通过来自 Amazon S3 的 HTTP 连接向下传输数据。由于 HTTP 连接已打开并等待,调用getObject 后请务必快速读取流,并记得关闭流,以便正确释放 HTTP 连接。

    【讨论】:

      猜你喜欢
      • 2013-08-05
      • 2011-09-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多