首先,让我简要介绍一下这个场景。我正在写一个简单的游戏,几乎所有的工作都是在服务器端完成的,有一个瘦客户端供玩家访问它。玩家登录或创建帐户,然后可以通过在网格中移动来与游戏交互。当他们进入一个小区时,他们应该被告知该小区中的其他玩家,同样地,该小区中的其他玩家将被告知该玩家进入该小区。可以进行许多其他交互和操作,但是不值得详细介绍它们,因为它更加相同。当玩家退出然后重新登录或者如果服务器停机并重新启动时,所有游戏状态都应该持续存在,但是如果服务器崩溃,那么如果我失去10分钟左右的更改则无关紧要。
我决定使用NHibernate和一个SQLite数据库,所以我一直在NHibernate上阅读很多内容,按照教程和编写一些示例应用程序,我对如何解决这个问题感到非常困惑!
我的问题是:管理会话的最佳方式是什么?只是从我理解的少量数据中,所有这些可能性都突然出现在我身上:
我应该使用什么样的策略来获得不错的性能,因为每秒可能有数百个客户端可能会有很多更新,插入,删除和查询,而且它们都必须彼此一致?< / p>
另一个较小的问题:我应该如何以有效的方式使用交易?是否可以将每一次更改都放在自己的事务中,或者当我有数百个客户端都试图改变网格中的单元格时,这种情况会不会很糟糕?我是否应该尝试弄清楚如何将类似的更新批量放在一起并将它们放在一个事务中,还是会变得太复杂?我甚至需要大部分交易吗?
答案 0 :(得分:10)
我将每个请求使用一个会话到服务器,每个会话一个事务。在应用程序成熟之前,我不会针对性能进行优化。
回答您的解决方案:
现在更详细一点是没用的,因为我只想重复手册/教程/书。当您按请求使用会话时,您可能不会在您描述的99%的应用程序中遇到问题(可能根本不会)。 Session是一个轻量级而不是线程安全的类,它的寿命非常短。当你想知道会话/连接/缓存/事务管理的确切工作方式时,我建议先阅读一本手册,然后再询问一些关于不清楚主题的更详细的问题。
答案 1 :(得分:1)
阅读此page NHibernate文档中的“ISessionFactory
”。 ISession
s意味着是单线程的(即,不是线程安全的),这可能意味着您不应该跨用户共享它。应用程序应创建ISessionFactory
一次,并为每个工作单元创建ISession
。请记住,创建ISession
并不一定会导致打开数据库连接。这取决于您的SessionFactory连接池策略的配置方式。
您可能还想查看Session and Transaction上的Hibernate文档。
答案 2 :(得分:0)
我的目标是将所有内容保留在内存中,并且日记更改或定期离线快照。
答案 3 :(得分:0)
请仔细阅读NHibernate Best Practices with ASP.NET,这里有一些非常好的提示可供选择。如上所述已经非常小心ISession,因为它不是线程安全的,所以请记住这一点。
如果您需要更复杂的东西,请查看NHibernate.Burrow contrib项目。它表示类似“Burrow提供的真正功能是Burrow会话可以跨越多个http请求”。