我正在爲使用Spring和MongoDB的遊戲製作Web服務。其中一個特點是,玩家每天都可以對其他玩家投票殺死。在一天結束時,選票將被記錄下來,而得票最多的選手將被殺死。下面是殺死-投票,大多數球員的代碼(較大的方法中調用endDay()
):Spring MongoDB不一致持久性問題
//mostVotes is the player's id in the database.
//Player is just a transient domain object
//playerDAO is a custom DAO that interfaces with MongoDB (see below)
Player accused = playerDAO.getPlayerByID(mostVotes);
logger.info(accused.getIsDead()); //This is false
doKill(accused);
logger.info(playerDAO.getPlayerByID(mostVotes).getIsDead()); //This is true
這裏的getPlayerByID():
//mongoTemplate is a MongoOperations object
public Player getPlayerByID(String id) throws NoPlayerFoundException {
Player p = mongoTemplate.findById(id, Player.class);
if (p == null) {
throw new NoPlayerFoundException(id);
}
return p;
}
而且doKill():
private void doKill(Player p) {
p.setIsDead(true);
playerDAO.updatePlayer(p);
}
而且updatePlayer():
public void updatePlayer(Player p) {
mongoTemplate.save(p);
}
正如你所看到的,當我在殺死他後立即要求球員的狀態時(在endDay()
),他似乎已經死了,這正是我們想要的。
現在我向/player/id
發出請求,其中id
是玩家的ID。這給了我一個對生成的Player對象的JSON編碼(使用與上面相同的getPlayerByID()
)。如果我以死亡玩家的身份提出這個請求,他會恢復活力。
更復雜的是,其他更新通過請求很好地通過。例如,某些玩家可以不投票就殺死其他玩家。這次殺戮使用完全相同的Player
,getPlayerByID()
,doKill()
和updatePlayer()
,並且受害者的死亡持續存在。
我目前正在本地主機上的Tomcat v7.0服務器上運行此操作。
如果您喜歡,您還可以直接看源代碼:[link](https://github.com/err1100/Werewolf)。 – err1100