在获得原始开发人员许可的情况下,我正在用 Java 重新实现一个旧的 BBS MUD 游戏。目前我正在使用带有 EJB 会话外观的 Java EE 6 用于游戏逻辑和 JPA 用于持久性。我选择会话 bean 的一个重要原因是 JTA。
我对网络应用程序更有经验,如果你得到一个 OptimisticLockException,你只需抓住它并告诉用户他们的数据已经过时,他们需要重新申请/重新提交。在多用户游戏中一直以“再试一次”来回应会带来可怕的体验。考虑到我希望几个人在战斗中瞄准一个怪物,我认为 OptimisticLockException 的可能性会很高。
我的视图代码(呈现 telnet CLI 的部分)是 EJB 客户端。我应该捕获 PersistenceExceptions 和 TransactionRolledbackLocalExceptions 并重试吗?你如何决定何时停止?
我应该切换到悲观锁定吗?
在每个用户命令过度杀伤后都坚持吗?我是否应该将整个世界加载到 RAM 中并每隔几分钟转储一次状态?
我是否让我的会话外观成为一个 EJB 3.1 单例,它可以作为一个阻塞点,从而消除执行任何类型的 JPA 锁定的需要?EJB 3.1 单例用作多读取器/单写入器设计(您将方法注释为读取器和写入器)。
基本上,对于应用程序中的高并发数据更改,在向用户呈现重新提交/重试提示是不可接受的情况下,最好的设计和 java 持久性 API 是什么?