Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在Akka';他是个很有技巧的演员吗?_Postgresql_Scala_Akka_Slick_Actor - Fatal编程技术网

Postgresql 在Akka';他是个很有技巧的演员吗?

Postgresql 在Akka';他是个很有技巧的演员吗?,postgresql,scala,akka,slick,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)) }

我正在尝试使用DB actor将记录插入数据库。我有数百万张唱片。然而,在运行之后,数据库只有十条记录。我知道数据库连接是一种状态,我认为这种情况存在问题。下面是我的代码表示

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

数据库是一个关系数据库,“产品”是一个TableQuery,DBConfig有一个数据库连接和会话。在保证的情况下,使用此参与者插入记录的最佳方式是什么。

使用批处理而不是逐个保存记录db.run()方法是异步的,所以它返回将来的立即数,稍后在不同的线程上执行,所以Actor除了方法调用(db.run)之外什么都不做。您应该抵制对db.run()方法结果的回调(onFailure),这样您就可以查看是否发生了任何失败。参见示例(它不是编译代码):


使用批处理而不是逐个保存记录db.run()方法是异步的,所以它返回将来的立即数,稍后在不同的线程上执行,所以Actor除了方法调用(db.run)之外什么都不做。您应该抵制对db.run()方法结果的回调(onFailure),这样您就可以查看是否发生了任何失败。参见示例(它不是编译代码):


请记住,
db.run
实际上是一个包含有关写入的有用信息的未来。您至少应该将未来的结果反馈给此参与者,以便检查写入是否成功。请记住,
db.run
实际上是一个包含有关写入的有用信息的未来。你至少应该把未来的结果反馈给这个参与者,这样你就可以检查写成功了。如果我使用这种解决方案,会有任何竞争条件吗?我们能阻止db.run吗?不,永远不会。在actor中,您可以保持可变变量。不要阻止db.run。请尝试此解决方案。如果有任何问题,请告诉我。我说它工作得很好,但有一个新问题。我有大约500000张唱片,我尝试了你的解决方案。然而,经过处理,我只有5000条记录。Future不会在onFailure块中引发任何异常。我能为这个问题做些什么?你在杀死JVM吗?什么时候?例如,我还使用Java的Cassandra驱动程序。当我使用它时,写数据没有问题。然而,我在使用Slick时遇到了很多问题。有时候,Slick可能会出现这样的错误<代码>Postgres:获取持久化数据时出错java.util.concurrent.RejectedExecutionException:Task slick.backend.DatabaseComponent被java.util.concurrent.ThreadPoolExecutorRunning拒绝,池大小=20,活动线程=20,排队任务=5000,已完成任务=380]注意:我在批处理操作中有重复记录。它会导致吗?嗯,“文档”现在是可变的。如果我使用这种解决方案,会有任何竞争条件吗?我们能阻止db.run吗?不,永远不会。在actor中,您可以保持可变变量。不要阻止db.run。请尝试此解决方案。如果有任何问题,请告诉我。我说它工作得很好,但有一个新问题。我有大约500000张唱片,我尝试了你的解决方案。然而,经过处理,我只有5000条记录。Future不会在onFailure块中引发任何异常。我能为这个问题做些什么?你在杀死JVM吗?什么时候?例如,我还使用Java的Cassandra驱动程序。当我使用它时,写数据没有问题。然而,我在使用Slick时遇到了很多问题。有时候,Slick可能会出现这样的错误<代码>Postgres:获取持久化数据时出错java.util.concurrent.RejectedExecutionException:Task slick.backend.DatabaseComponent被java.util.concurrent.ThreadPoolExecutorRunning拒绝,池大小=20,活动线程=20,排队任务=5000,已完成任务=380]注意:我在批处理操作中有重复记录。这会导致什么?
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)
}

}