首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注入数据库连接池

注入数据库连接池
EN

Stack Overflow用户
提问于 2015-09-12 23:29:25
回答 1查看 1K关注 0票数 3

我已经开始使用MacWire作为我的Play应用程序的依赖注入,并且我在试图插入数据库连接时遇到了问题。

在使用DI之前,我的代码如下所示:

代码语言:javascript
复制
DB.withConnection { implicit connection =>
  ...
}

在使用DI之后,这不再起作用了。我得到了以下例外:java.lang.InstantiationException: play.api.db.DBApi

我的应用程序加载程序:

代码语言:javascript
复制
class Loader extends ApplicationLoader {
  def load(context: Context) = {
    val components = new BuiltInComponentsFromContext(context) with Components
    components.application
  }
}

应用程序的主要组件:

代码语言:javascript
复制
trait Components extends BuiltInComponents with I18nComponents
                 with RepositoryModule {

  lazy val assets: Assets = wire[Assets]
  lazy val router: Router = wire[Routes] withPrefix "/"
}

和储存库模块:

代码语言:javascript
复制
trait RepositoryModule {
  lazy val userRepository = wire[UserRepository]
}

我如何获得和使用数据库连接池并注入它,以便它可以在存储库中使用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-20 20:47:17

我使用DBComponentsBoneCPComponentsRepositoryModule中的特性来解决它。有了它们,我可以得到一个Database对象,将它注入到存储库中。这是我为模块使用的代码:

代码语言:javascript
复制
trait RepositoryModule extends BuiltInComponents with DBComponents with BoneCPComponents {
  lazy val database: Database = dbApi.database("default")
  lazy val userRepository = wire[UserRepository]
}

数据库“默认”将在db.default中使用application.conf配置。这个解决方案的主要问题是,您需要从池中获取连接并在完成后返回它们。我不知道是否可以改进它来模仿withConnection方法。

使用注入数据库的用户存储库示例:

代码语言:javascript
复制
class UserRepository(db: Database) {
  def deleteAdults: Unit = {
    val connection: Connection = db.getConnection()
    val removed: Int = SQL("DELETE * FROM User WHERE age > 18").executeUpdate()(connection)
    connection.close()
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32544800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档