Postgresql 在Akka';他是个很有技巧的演员吗?
我正在尝试使用DB actor将记录插入数据库。我有数百万张唱片。然而,在运行之后,数据库只有十条记录。我知道数据库连接是一种状态,我认为这种情况存在问题。下面是我的代码表示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)) }
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)
}
}