gpt4 book ai didi

postgresql - 使用 Slick 在 Akka 的 Actor 中插入记录的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-29 14:18:59 24 4
gpt4 key购买 nike

我正在尝试使用 DB actor 将记录插入到数据库中。我有数百万条记录。但是运行之后,数据库只有十条记录。我知道数据库连接是一个状态,我觉得这个状态有问题。这是我的代码代表。

class DBActor extends Actor with DBConfig {
override def receive: Receive = {
case Message(id, title) =>
db.run(products += Product(id, title))
}
}

数据库是一个关系数据库,'products' 是一个 TableQuery,DBConfig 有一个数据库连接和 session 。插入记录的最佳方式是保证此 Actor 。

最佳答案

使用批量而不是一条一条地保存记录。 db.run() 方法是异步的,因此它会立即返回 future ,并且稍后会在不同的线程上执行,因此 Actor 除了方法调用(db.run)之外什么都不做。你应该抵制回调(onFailure)在 db.run() 方法的结果上,以便您可以查看是否发生任何故障。请参见示例(它不是编译代码):

case object Insert

case object Flush

class DBActor extends Actor with DBConfig {


implicit val dispatcher = context.dispatcher

val bulkLimit:Int = 1000

val flushTime:Int = 10

var documents = List.empty[Product]

/***
* Start automatic flushing when actor start
*/
context.system.scheduler.scheduleOnce(flushTime second, self, Flush)

def receive:Receive={

case document: Document =>
documents =documents :+ document
log.info(s"DBActor received document [total count ${documents.length}]")
if (documents.length >= bulkLimit) self ! Insert

case Insert =>
if (documents.length > 0) {
val batch = documents.take(bulkLimit)
db.run(products ++= batch).onFailure { case ex: Exception => log.error("Getting error on persisting data", ex) }
documents = documents.drop(bulkLimit)
}

case Flush =>
if (documents.length > 0) self ! Insert

context.system.scheduler.scheduleOnce(flushTime second, self, Flush)
}

}

关于postgresql - 使用 Slick 在 Akka 的 Actor 中插入记录的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36817808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com