我有一个多线程、多服务器的 Web 应用程序,它带有休眠和使用 AOP 管理事务的弹簧。问题是,我需要维护内存数据并使其与数据库的状态保持同步……基本上我正在实现内存缓存。
现在,有什么方法可以让我的内存中 pojos 在与休眠/春季事务性相同的级别上进行事务处理?我有分层 30 个类的服务调用,但我永远不知道提交会发生在哪里。我有哪些选择?
我有一个多线程、多服务器的 Web 应用程序,它带有休眠和使用 AOP 管理事务的弹簧。问题是,我需要维护内存数据并使其与数据库的状态保持同步……基本上我正在实现内存缓存。
现在,有什么方法可以让我的内存中 pojos 在与休眠/春季事务性相同的级别上进行事务处理?我有分层 30 个类的服务调用,但我永远不知道提交会发生在哪里。我有哪些选择?
如果我很好地理解您的需求,那么在某些情况下,您会问一些微妙的问题。让我尝试一个例子,以检查我是否理解正确:
- 线程 T1 读取缓存中的 pojo P,获取版本 P1。
- 线程 T2 读取缓存中的 pojo P,获取版本 P1。
- 线程 T2 开始事务,读取相同的 pojo,修改创建版本 P2 的值。
- 线程 T1 读取缓存中的 pojo P,仍然获得版本 P1。这要求对于第 3 点,T2 收到版本 P1 的副本 P2,而不是同一个对象。
- 线程 T2 保存 P,T1 或 T2 没有任何变化,它们有不同的版本。
- 线程 T2 关闭事务
:如果回滚,T2 将使用 P1,就像 T1 一样。
湾。如果提交,T2 将继续使用 P2。但现在 T1 也必须使用 P2。
你可以看到这是一个复杂的问题,不要小看它。在理论层面上已经有很多问题需要解决(当你编写代码时你会有更多问题......)。如果您想成功使用它,您的架构需要非常清晰。如果没有,你会冒着精神健全的风险;-)
首先,你需要确保你真的想要这样的东西!
如果你真的想要那个..
我建议使用技术代码(AOP、ThreadLocal)从你的功能代码中隐藏这个棘手的复杂性。
您的提交/回滚很可能已经通过 AOP 完成,所以这应该没问题。
要隐藏 P 实例的检索(有时是存储缓存中的实例,有时是副本):使用名为 Store 的类将值存储在缓存中,具有 Store 类型的 ThreadLocal 变量。我会为您当前的线程使用 ThreadLocal 变量:
使用 Hibernate 的二级缓存是否不能满足您的要求?JBoss Cache 提供者既是分布式的又是事务性的。
如果这对您不起作用,您必须解释为什么以及您真正想要实现的目标是什么,以便获得有意义的回应。