我重新实现在Java中的老BBS MUD游戏从最初的开发许可。目前我使用的Java EE 6的EJB会话外墙为游戏逻辑和JPA的持久性。一个很大的原因,我拿起会话bean是JTA。

我更有经验,与Web应用程序中,如果你得到一个OptimisticLockException你只是抓住它,并告诉用户他们的数据是陈旧的,他们需要重新申请/补办。与响应“重试”的所有时间在一个多用户游戏将使一个可怕的经历。鉴于我期望几个人一拼,我认为一个OptimisticLockException的几率就会很高期间针对单个怪物。

我的视图代码,呈现一个telnet CLI的一部分,是EJB客户端。我应该捕捉从PersistenceExceptions和TransactionRolledbackLocalExceptions,只是重试?你如何决定何时停止?

我应该切换到悲观锁?

时每一个用户命令之后矫枉过正持续?我应该在RAM加载整个世界倾倒的状态每隔几分钟?

让我的会话门面EJB 3.1单这将作为一个瓶颈,因此无需做任何类型的JPA锁定的? EJB 3.1单身用作多个读取器/写入器单设计(你注释方法如读取器和写入)。

基本上,什么是最好的设计和Java持久性API为在应用程序中高并发数据的变化,其中它是不能接受的本重新提交/重试提示用户?

有帮助吗?

解决方案

我不禁觉得你大规模过于复杂什么应该是一个简单的问题。

商业和成功网游经常采取这样一种方法:

Every few minutes or after a significant action:
    copy the player data
    pass the player data to a background thread

In the background thread:
    write each piece of player data to the database

有,因为每个玩家保存自己的数据,到数据库的不同行不是“高并发的”数据的变化。 (在某些情况下,这简直是一个行 - 几个商业游戏只是玩家数据存储为针对用户ID的斑点。)有时候数据是有点陈旧,但是这不重要。如果服务器崩溃,否则你会最终得到的当前状态到DB这只会是一个问题。这就是我们正在谈论的不是银行间信用转账。

至于泥浆和BBS的游戏,他们的算法本来简单一些:

Every few minutes or after a significant action:
    For each property in the player object:
        write a property to the player's file

再次没有争在这里,因为每个球员都有自己的文件。

每一个用户命令之后坚持确实是矫枉过正,除非你的游戏是高度货币化还有的人的风险起诉你,如果他们失去了真棒由于+3斧服务器崩溃。

和其他东西在世界上你需要比玩家坚持其他?有经常坚持一切负面影响游戏性,所以通常你不希望这样做。

作为用于到同一怪物“并发”访问,按您的例子,它并不重要。如果你有一个单一的过程中,怪物应该是在RAM中。您的单进程仲裁谁得到击中怪物和以什么顺序。这不是你的持久层的工作。处理在游戏中的游戏逻辑和持续的结果。

其他提示

如果我记得没错,很多经典的MUD游戏确实加载整个世界在RAM中,周期性地更新状态。当然,我的记忆是从日,一个16MB大小的过程被认为是可怕。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top