关于Morphia版本(乐观锁定)

时间:2015-03-24 19:56:56

标签: mongodb redis morphia

由于我们的项目从MongoDB读取和写入数据的频率非常高,我们决定将一些数据加载到Redis以减少写入/读取Mongo的请求。

我们将实体的id存储为redis-key,实体的redis-value序列化JSON字符串。存储在Redis中的数据如下:

key   :  "id_18035138" 
value :  "{
           "id":"...",
           ...,
           "version":1
          }

存储这些数据后,当我们需要更新数据时,我们首先将JSON字符串解析为实体,然后更新属性,然后刷新Redis中的数据。所以Redis中的数据将是最新的数据。

当我们需要将Redis数据保存到MongoDB时,我们首先将JSON字符串解析为实体,然后使用Morphia DAO来保存实体,但我们遇到了这个异常:

java.util.ConcurrentModificationException: Entity of class com.lk.game.entities.User (id='...',version='1') was concurrently updated.

我知道这一定是乐观锁定的问题。我们怎么能解决这个并发异常?

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

  

我们怎样才能解决这个并发异常?

不同时写作......显然你至少有两个演员并行写回同一个文件。

我不认为可以通过您提供的信息了解系统中发生的情况或原因。

也许你也可以改变架构?

  • 您可以自行处理MongoDB的负载吗?更多的硬件,更好的分片,更多的调整...... - 这不会解决generell中的并发问题,但你可以缩短碰撞窗口。
  • 你可以自己使用Redis吗?至少对于某些操作来说,从Redis读取数据似乎就足够了。
  • 你需要乐观的版本控制吗?或者" last-write-wins"工作呢?
  • 也许MongoDB只是这个任务的错误数据库,你可以用CouchBase替换MongoDB + Redis(内置memcached和"更好"分片到一致的环哈希)