3

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"""
    }
  }

トランザクションを持ち、セッションに依存せず、クラス署名で scalike する方法はありますか?

4

1 に答える 1

0

アプリケーションがノンブロッキング アーキテクチャでない場合は、DB セッションにスレッド ローカルを使用できます。

于 2016-04-02T01:50:14.913 に答える