Внедрить пул соединений с базой данных
Я начал использовать 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()
}
}