【问题标题】:Passing scala slick table in the akka actor message在akka actor消息中传递scala slick table
【发布时间】:2015-01-06 17:17:11
【问题描述】:

我想发送 slick table 作为 akka actor 消息的一部分。这样另一端的远程actor可以连接到数据库,并且可以对mysql数据库进行CRUD操作。我无法理解这些光滑的类型,我发现编译器/eclipse 在抱怨。我怎样才能做到这一点。将灵活查询作为参与者消息的一部分传递是个好主意吗?

object RemoteActorMessages {
  case class Create(table: Table[A])
  case class RunQuery(query: Query[_, _, _])
  case Result(code: Int, message: String)
}

class DBActor extends Actor {
  def recieve = {
    case Create(table) => createTable(table)
    case RunQuery(query) => runQuery(query)
   case ... //so on
  }
}

def createTable(table: Table[M]): Future[A]  = Future {
   db.withSession(implicit session => tableQuery[table].ddl.create)
}

def runQuery(query: Query[_, _, _]): Future[A] = Future {
   db.withSession { implicit session => {
                                       query.run
                                     }
                                   }
}

警告:代码可能有一些类型错误。观众赞赏谨慎

我对如何将结果发送回消息的发件人感到困惑。例如:query.list.run 返回模型对象列表。那么,我应该如何通过 Result 消息框起来

【问题讨论】:

  • 为什么不将详细信息作为部分消息发送,然后在服务器上创建查询。错误/警告到底是什么。
  • @korefn 如何向 DbActor 发送消息以在数据库中创建表。
  • @korefn。我想在 DBActor 消息中合并泛型类型,以便可以将任何具体的表类型发送给它,就像我们在依赖注入中所做的那样。之后 DBActor 可以调用泛型上的 ddl.create 以键入以在数据库中创建表。

标签: mysql scala akka actor slick-2.0


【解决方案1】:

我认为这是“当你有一把锤子时,一切都变成了钉子”的例子。我相信这不是演员的正确用例。一个原因(不是唯一的一个)是数据库操作“慢”并且它们会长时间阻塞参与者线程。

可以说您想要一个管理表操作的服务,使用 Futures 和自定义执行上下文来隔离影响(例如,在 Play 中完成 like this)。比如:

object DBService {
   def createTable() : Future[Boolean] = ???
   ...
}

Actor 应该只接收像 CreateTable 这样的命令,然后调用服务中的相应方法。

顺便说一句,这将简化您的用例,因为服务可以了解更多关于表格和其他 Slick 细节的信息,而参与者则不会注意到它们。

不是唯一的方法,但可以说更简单。

【讨论】:

  • 你所说的一切都是绝对正确的,这样做我会让 DBActor 对其他请求充耳不闻。但是,我关心的不是那个,而是我应该如何将 Table[A] 发送给参与者,以便我可以从中创建表查询,然后在将来包装表创建以避免让演员耳聋。
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2012-09-02
  • 2015-08-05
  • 1970-01-01
相关资源
最近更新 更多