Scalikejdbc. Управление транзакциями без явной зависимости от Scalikejdbc и сеанса

Насколько я понимаю из документов Scalikejdbc, если я хочу иметь транзакцию, мне нужно пройти сеанс. Как это:

  class FooBarService {

    val fooDao = new FooDao
    val barDao = new BarDao

    def fooBar(): Unit = {
      DB localTx { session =>
        fooDao.foo(new Foo())
        barDao.bar(new Bar())
      }
    }
  }

  class FooDao {
    def foo(foo: Foo)(implicit session: DBSession): Unit = {
      sql"""bla bla bla"""
    }
  }

  class BarDao {
    def bar(bar: Bar)(implicit session: DBSession): Unit = {
      sql"""bla bla bla"""
    }
  }

И это делает меня явно зависимым от Scalikejdbc. Я не хочу иметь зависимость от Scalike в свойствах своего домена. Я хочу что-то вроде этого:

class FooBarService {

    val fooDao = new FooDao
    val barDao = new BarDao

    def fooBar(): Unit = {
      // My wrapper which abstract and is not dependent on Scalike or other library
      MyWrapper.withinTransaction {
        fooDao.foo(new Foo())
        barDao.bar(new Bar())
    }
      // or at least not to pass session to daos
      DB withinTransaction {
        fooDao.foo(new Foo())
        barDao.bar(new Bar())
      }
    }
  }

  class FooDao {
    def foo(foo: Foo): Unit = {
      sql"""bla bla bla"""
    }
  }

  class BarDao {
    def bar(bar: Bar): Unit = {
      sql"""bla bla bla"""
    }
  }

Есть ли способ иметь транзакции и не иметь зависимостей от сеансов и масштабирования в подписи класса?


person Artem Malinko    schedule 29.03.2016    source источник
comment
Вы когда-нибудь находили решение?   -  person jen    schedule 07.03.2018
comment
@ Джен нет. Мы перешли на Slick. Scalikejdbc и его транзакции беспокоили меня, потому что я не хотел добавлять сторонние зависимости к своим сигнатурам методов. У Slick есть несколько похожие проблемы (нам нужно выставить DBIOAction, если мы хотим объединить их в транзакцию), но теперь я тоже думаю, что это не проблема.   -  person Artem Malinko    schedule 07.03.2018


Ответы (1)


Если ваше приложение не является неблокирующей архитектурой, вы можете использовать локальный поток для сеанса БД.

person Kazuhiro Sera    schedule 02.04.2016