Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Multithreading 在多线程环境中更新geoip2 DatabaseReader_Multithreading_Scala_Maxmind_Geoip2 - Fatal编程技术网

Multithreading 在多线程环境中更新geoip2 DatabaseReader

Multithreading 在多线程环境中更新geoip2 DatabaseReader,multithreading,scala,maxmind,geoip2,Multithreading,Scala,Maxmind,Geoip2,我正在使用maxmind geoip2 API中的DatabaseReader对象。 val reader=new Builder(new FileInputStream(filePath)).build。此对象已经是线程安全的,并且在多个读卡器线程之间共享。它使用原子引用存储相关信息,并实现可关闭接口来释放数据 this.bufferHolderReference=新的原子引用(bufferHolder) 我定期下载一个新的数据库文件,并希望将reader对象更新为新的。重新创建这个对象的正确

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

this.bufferHolderReference=新的原子引用(bufferHolder)

我定期下载一个新的数据库文件,并希望将reader对象更新为新的。重新创建这个对象的正确方法是什么,这样读卡器线程就不会出现故障(它们总是得到一个正确的对象)并且没有内存泄漏。我也尝试过将这个reader对象包装在一个原子引用中,但是由于某种原因,我的内存泄漏了

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()
}