Multithreading 在多线程环境中更新geoip2 DatabaseReader
我正在使用maxmind geoip2 API中的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对象更新为新的。重新创建这个对象的正确
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()
}