Внедрить пул соединений с базой данных

Я начал использовать MacWire для внедрения зависимостей моего приложения Play, и у меня возникают проблемы при попытке подключиться к базе данных.

Перед использованием DI мой код выглядел так:

DB.withConnection { implicit connection =>
  ...
}

Это больше не работает после использования DI. Я получаю следующее исключение: java.lang.InstantiationException: play.api.db.DBApi,

Загрузчик моего приложения:

class Loader extends ApplicationLoader {
  def load(context: Context) = {
    val components = new BuiltInComponentsFromContext(context) with Components
    components.application
  }
}

Основные компоненты приложения:

trait Components extends BuiltInComponents with I18nComponents
                 with RepositoryModule {

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

И модуль репозитория:

trait RepositoryModule {
  lazy val userRepository = wire[UserRepository]
}

Как я могу получить и использовать пул соединений с базой данных и внедрить его, чтобы его можно было использовать в репозитории?

1 ответ

Решение

Я решил это с помощью DBComponents а также BoneCPComponents черты в RepositoryModule, С ними я мог бы получить Database возразить и вставить его в хранилище. Вот код, который я использую для модуля:

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 метод.

Пример репозитория пользователя, использующего внедренную базу данных:

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()
  }
}
Другие вопросы по тегам