在Slick 3.0中使用trait mixin实例化与db的单个连接

时间:2016-06-10 09:37:25

标签: scala slick mixins traits slick-3.0

我有一个定义数据库连接的特性:

trait Db {
  val db: Database = Database.forConfig("twitter-indexing-db")
}

然后我将其扩展到我使用Db的另一个特征:

trait TwitterIndexingRepository {
  self: Db =>
  ...
}

最后,我实例化一个具有所需功能的对象:

object PostgresTwitterIndexingRepository extends TwitterIndexingRepository with Db

如果我有多个mixin,我会有多个连接/连接池对给定的数据库开放吗?

这似乎有点不好,与Spring DI,你可以获得一个连接并在任何你需要的地方注入它。

1 个答案:

答案 0 :(得分:0)

看起来您正在尝试使用cake pattern

如果您要使用此功能,则Db特征应使用def,而PostgresTwitterIndexingRepository应覆盖val

trait Db {
  def db: Database
}

object PostgresTwitterIndexingRepository
    extends TwitterIndexingRepository with Db {
  override val db = Database.forConfig("twitter-indexing-db")
}

这只会创建一个数据库实例,如您所愿。正如评论者提到的那样,你也可以使用其他方法来确保只创建一个实例 - 构造函数参数,隐式构造函数参数,全局单例等。