如何让我的pojos交易?

时间:2009-09-22 16:10:29

标签: hibernate spring transactions pojo

我有一个多线程,多服务器的Web应用程序,使用hibernate和Spring管理AOP事务。问题是,我需要维护内存中的数据并使其与数据库的状态保持同步......本质上我正在实现内存缓存。

现在,有没有办法让我的内存pojos事务处理与hibernate / spring事务性处于同一级别?我有分层30个类的服务调用,我永远不知道提交的位置。我有什么选择?

2 个答案:

答案 0 :(得分:2)

如果我理解你的需要,在某些情况下,你会问一些微妙的东西。让我尝试示例,检查我是否理解正确

  
      
  1. 线程T1在缓存中读取pojo P,获得版本P1。
  2.   
  3. 线程T2在缓存中读取pojo P,获得版本P1。
  4.   
  5. 线程T2启动事务,读取相同的pojo,修改创建版本P2的值。
  6.   
  7. 线程T1在缓存中读取pojo P,仍然获得版本P1。这要求对于第3点,T2收到版本P1的副本P2,而不是同一个对象。
  8.   
  9. 线程T2保存P,T1或T2没有任何变化,它们有不同的版本。
  10.   
  11. 线程T2关闭交易:
      一个。如果回滚,T2将使用P1,如T1所示   湾如果提交,T2将继续使用P2。但是现在T1也必须使用P2。
  12.   

你可以看到这是一个复杂的问题,不要低估它。 在理论层面上已经有许多问题需要解决(当你编码时你会得到更多......)。 如果要成功使用它,您的架构必须非常清晰。 如果没有,你冒着心理健康的风险;-)

首先,你需要确保你真的想要这样的东西!


如果你真的想要......

我建议使用技术代码(AOP,ThreadLocal)来隐藏功能代码中这种棘手的复杂性

  • 您的提交/回滚可能已经通过AOP完成,所以这应该没问题。

  • 隐藏P实例的检索(有时是存储缓存中的实例,有时是副本):使用名为Store的类将值存储在缓存中,具有Store类型的ThreadLocal变量。我会为当前线程使用ThreadLocal变量:

    • 只能在事务性AOP代码中更改Store实例,而不能在功能代码中更改
    • 您的功能代码使用当前的ThreadLocal实例来操作实体(保存等...)
    • 在事务外时,ThreadLocal实例是缓存的实例,我们称之为CACHE。
    • 输入交易为当前线程设置不同的ThreadLocal实例;该类是Store的子类,它会在您要求时返回缓存对象的副本;该类还将记忆是否保存了一些(因此您需要使用此特殊API保存它们,或在常规保存API中通知)
    • 回滚一个事务会丢弃ThreadLocal实例,为当前线程重新安装CACHED实例
    • 提交一个事务将在ThreadLocal实例中执行所有记忆数据库操作,应用它来修改CACHED实例,并为当前线程重新安装CACHED实例

答案 1 :(得分:1)

使用Hibernate的2nd level cache是否不符合您的要求? JBoss Cache提供程序既是分布式的,也是事务性的。

如果这对您不起作用,您将必须解释为什么以及为了获得有意义的回应而您真正想要实现的目标。