我正在尝试使用 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/