1

我正在使用来自 maxmind geoip2 API 的 DatabaseReader 对象。 val reader = new Builder(new FileInputStream(filePath)).build. 该对象已经是线程安全的,并且在多个读取器线程之间共享。它使用 AtomicReference 存储相关信息,并实现 Closeable 接口以释放数据。

this.bufferHolderReference = new AtomicReference<>(bufferHolder);

我定期下载一个新的数据库文件,并希望将阅读器对象更新为新的。重新创建此对象的正确方法是什么,以便读取器线程没有故障(它们总是得到正确的对象)并且没有内存泄漏。我也尝试将这个阅读器对象包装在 AtomicReference 中,但由于某种原因我有内存泄漏。

def createReader: DatabaseReader = {
  ...
  new Builder(new FileInputStream(filePath)).build
}

val geoIpDatabase: AtomicReference[DatabaseReader] = new AtomicReference(createReader) //initialisation

//called periodically
def updateDb(): Unit = {
  val oldGeoDb = geoIpDatabase.get()
  geoIpDatabase.compareAndSet(oldGeoDb, createReader)
  oldGeoDb.close()
}
4

0 回答 0