[英]Cache Cassandra table in scala application
我需要從Cassandra中獲取一些數據,以用於Kafka-Streams流應用程序中的條目。 我需要對ID執行聯接。 我想設置一個緩存以節省查詢時間。 該表很簡單: id | name ---|----- 1 |Mike
id | name ---|----- 1 |Mike
我的計划很簡單:從數據庫中查詢表,然后存儲到Map[Int, String]
。
主要問題是-表中的數據可能會更改,並且需要定期更新,因此我需要不時查詢它。
到目前為止,我已經提出了這樣的線程解決方案:
// local database mirror
class Mirror(user: String, password: String) extends Runnable {
var database: Map[Int, String] = Map[Int, String]() withDefaultValue "undefined"
def run(): Unit = {
update()
}
//
def update(): Unit = {
println("update")
database.synchronized {
println("sync-update")
// val c = Driver.getConnection(...)
// database = c.execute(select id, name from table). ...
database += (1 -> "one")
Thread.sleep(100)
// c.close()
}
}
def get(k: Int): Option[String] = {
println("get")
database.synchronized {
println("sync-get")
if (! (database contains k)) {
update()
database.get(k)
} else {
database.get(k)
}
}
}
}
主要看起來像這樣:
def main(args: Array[String]): Unit = {
val db = new Mirror("u", "p")
val ex = new ScheduledThreadPoolExecutor(1)
val f = ex.scheduleAtFixedRate(db, 100, 100, TimeUnit.SECONDS)
while(true) { // simulate stream
val res = db.get(1)
println(res)
Thread.sleep(10000)
}
}
它似乎功能正常。 但是我的代碼有什么陷阱嗎? 尤其是我對update
和get
功能的線程安全性沒有信心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.