Spring + Hibernate + JUnit(下)

常见的 setup 是一个 entity 有自动生成的 id 作为 key,也有几个 unique constraint 的 column 组成的 business key,常见创建这个 record 的行为是

  1. 试图通过 business key 找到这个 record,如果找到则返回
  2. 没有的话试图创建这个 record,如果创建成功则返回
  3. 如果抛出异常,违背了约束,说明出现 race condition,通常重新找这个 record 即可

就这样一个事情,我们大约有这么几个策略来实现 find or create 的逻辑:

  • service/application 层次上发现异常进行重试,一旦 create 失败就可以重新走 1、2,不需要走 3
  • 在 DAO 内部将 write ops 用单独的 session 解决,抛出的异常被捕获,然后抛出(供 BO 上方法捕获进而调用 3),需要自己管理 Session
  • 在 BO 这个 create or find 实现的方法里面捕获异常,通过某种方式要求 spring 重新绑定 session 继续

这三个方法自然各有优缺点:

  • 重试的逻辑看起来很傻也会让人觉得奇怪,通过 AOP 加入这个逻辑可以缓解这个问题
  • 或者通过 Propagation.REQUIRES_NEW 迫使每次的 find 都在新的 transaction 里面进行避免需要使用 Isolation.READ_COMMITTED,坏处另外一个是需要自己写 session management
  • 需要理解 spring 如何管理 session 的,于是实现与 spring/hibernate 的组合耦合在一起,好处是不需要重试也不需要自己管理 session 了

实际使用时,最常见的还是重试较多。

——————
And he went in also unto Rachel, and he loved also Rachel more than Leah, and served with him yet seven other years.

Advertisements
Spring + Hibernate + JUnit(下)

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s