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

标签 postgresql scala akka slick actor

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

相关文章:

mysql - 使用外键将 MySQL 代码转换为 PostgreSQL

actor - Akka::在 ActorSystem 中使用对事件流具有不同优先级的消息

scala - 与 Akka 不匹配的消息会发生什么?

node.js - 按位添加并在 Sequelize 中添加列

python - AWS Lambda S3 复制到 Postgres 成功但不复制数据

scala - Scala中Set = Int => Boolean类型的含义

用于数据科学应用程序的 Scala IDE(如 RStudio/Spyder/Rodeo)

list - List::: 运算符和++的区别

scala - Akka Actor-等待一段时间,等待消息,否则发送消息

postgresql - Docker-compose无法连接到Docker postgres容器