【发布时间】:2009-07-19 16:08:30
【问题描述】:
首先,让我简要介绍一下场景。我正在编写一个简单的游戏,其中几乎所有的工作都在服务器端完成,并带有一个瘦客户端供玩家访问它。玩家登录或创建帐户,然后可以通过在网格中移动来与游戏互动。当他们进入一个单元格时,应该通知他们该单元格中的其他玩家,同样,该单元格中的其他玩家将被告知该玩家进入该单元格。还有许多其他的交互和动作可以发生,但不值得详细介绍它们,因为它们几乎相同。当玩家注销然后重新登录时,或者如果服务器关闭并重新启动,所有游戏状态都应该保持不变,尽管如果服务器崩溃,我失去 10 分钟左右的更改也没关系。
我决定使用 NHibernate 和 SQLite 数据库,所以我阅读了很多关于 NHibernate 的资料,学习了教程并编写了一些示例应用程序,但对于我应该如何做这件事感到非常困惑!
我的问题是:管理会话的最佳方式是什么?仅从我确实了解的少量内容来看,所有这些可能性都在我身上跳出来:
- 拥有一个始终打开并供所有客户端使用的会话
- 为每个连接的客户端设置一个会话并定期刷新它
- 每次我必须使用任何持久化实体时打开一个会话,并在更新、插入、删除或查询完成后立即关闭它
- 为每个客户端设置一个会话,但保持断开连接,仅在需要使用时重新连接
- 与上述相同,但保持连接,仅在一段时间不活动后断开连接
- 保持实体分离,仅每 10 分钟附加一次,例如,提交更改
考虑到每秒可能同时来自数百个客户端的许多更新、插入、删除和查询,并且它们都必须彼此一致,我应该使用哪种策略来获得良好的性能?
另一个小问题:我应该如何有效地使用事务?每个单独的更改都在自己的事务中是否可以,或者当我有数百个客户端都试图更改网格中的单元格时,这是否会表现不佳?我是否应该尝试弄清楚如何将类似的更新集中在一起并将它们放在一个事务中,或者这会不会太复杂?我什至需要大部分交易吗?
【问题讨论】:
标签: c# database nhibernate transactions session