将 DAO 层放置在类似 Scala 的 Actor 中
Housing the DAO layer inside a Scala Akka Actor
我正在熟悉 Scala,但对 Akka 还是很陌生。这似乎是一个相当简单的问题,但我找不到关于这种特定方法的任何信息,这告诉我我的想法可能有问题,或者已经有一种非常标准的方法可以做到这一点。
我找到的所有解决方案都围绕着让 Akka actor 调用预构建的服务层,该服务层将处理数据库逻辑。
我的问题是让 DAO 本身成为持久化参与者是否可行。类似这样的事情:
class UserDAO extends Actor {
val db = actorSystem.actorSelection("/repository/dao")
def receive = {
case GetUserById(id) => sender ! (db ? RunStoredProc(SpGetUserById(id)))
...
}
}
以上纯粹是假设的伪代码,所有方法(即RunStoredProc
)仅作为示例。我更好奇这样一个系统的设计决策背后的理智。 UserDAO
和 DAO
(db
) 参与者将是持久的和无状态的(尽管 DAO
将持有数据库连接的句柄)。我所说的持久性是指它们不会被实际调用它们的参与者实例化。
我是在重新发明轮子吗?
你的方法看起来完全可行。这将允许您在一个地方处理所有基于连接的逻辑。
需要考虑的一个警告是,如果您的 DAO 是同步的,则对所有 DOA 调用使用单个参与者将意味着一次只能执行一个 DB 调用。这可能是合意的,也可能不是合意的。
我正在熟悉 Scala,但对 Akka 还是很陌生。这似乎是一个相当简单的问题,但我找不到关于这种特定方法的任何信息,这告诉我我的想法可能有问题,或者已经有一种非常标准的方法可以做到这一点。
我找到的所有解决方案都围绕着让 Akka actor 调用预构建的服务层,该服务层将处理数据库逻辑。
我的问题是让 DAO 本身成为持久化参与者是否可行。类似这样的事情:
class UserDAO extends Actor {
val db = actorSystem.actorSelection("/repository/dao")
def receive = {
case GetUserById(id) => sender ! (db ? RunStoredProc(SpGetUserById(id)))
...
}
}
以上纯粹是假设的伪代码,所有方法(即RunStoredProc
)仅作为示例。我更好奇这样一个系统的设计决策背后的理智。 UserDAO
和 DAO
(db
) 参与者将是持久的和无状态的(尽管 DAO
将持有数据库连接的句柄)。我所说的持久性是指它们不会被实际调用它们的参与者实例化。
我是在重新发明轮子吗?
你的方法看起来完全可行。这将允许您在一个地方处理所有基于连接的逻辑。
需要考虑的一个警告是,如果您的 DAO 是同步的,则对所有 DOA 调用使用单个参与者将意味着一次只能执行一个 DB 调用。这可能是合意的,也可能不是合意的。