2011-05-04 64 views
0

所以我正在用Spring和Hibernate构建一个Java webapp。在应用程序中,用户可以添加点到一个对象,我想计算给定的对象的点数。这些对象也存储在数据库中。希望有成百上千的人同时给予对象点数。我应该在哪里处理相同数据的并发操作?在应用程序或数据库中?

但是,如何计算点并将它们同时保存在数据库中?通常我只是在我的物体上有一个属性,只是增加点数。但这意味着我必须用悲观事务来锁定数据库中的数据,以防止出现并发问题(读取点数时,另一个线程已经完成了一半的更改)。这可能会让我的应用程序变得更慢(至少我以为会这样)。

另一种解决方案是将相关对象中给定点的数量存储起来,并将它们分别存储在数据库中,同时计算“小”同步块内存中的点数等。

哪个解决方案在处理同一对象上的许多并发操作时性能影响最小。或者还有其他配件解决方案吗?

回答

0

如果你想要值持久化,那么你应该坚持他们在你的数据库。

鉴于这种情况,请尝试以下操作:

  1. 创建一个非常窄行,像刚才OBJ_ID和点。
  2. 仅在OBJ_ID上创建索引,因此在插入,更新或删除值时,不会花费更多时间更新索引。
  3. 使用InnoDB,它有行级锁,这样锁就会变小
  4. 的MySQL会给你最后提交的(一致)值

这一切都非常简单。旋转!设置一个模拟您的预期负载并查看它的执行情况的测试用例。如果卡住了,请回复。

祝你好运。

+0

好吧,这听起来很合理,但你说,MySQL会给我最后承诺的价值。如果两个请求同时读取该值并尝试向db写入新值,会发生什么情况?最后一个写入错误还是会阻止第二个请求继续执行直到第一个请求完成? – suicide 2011-05-05 16:49:46

+0

启动事务,读取值,写入递增值,提交事务。一切安全。 – 2011-05-12 01:29:55

相关问题