まず、シナリオの簡単な説明をします。私はシンプルなゲームを書いていますが、プレイヤーがアクセスするためのシンクライアントを使って、サーバー側でほとんどすべての作業が完了しています。プレイヤーはログインしたり、アカウントを作成したりして、グリッドの周りを移動してゲームと対話することができます。彼らがセルに入ると、そのセルの他のプレイヤーに知らされるべきであり、同様に、そのセルの他のプレイヤーには、そのプレイヤーがそれに入ることが知らされるでしょう。他にもたくさんのインタラクションやアクションがありますが、その詳細については詳しく説明する必要はありません。プレーヤーがログアウトして戻ったり、サーバがダウンして復帰したりすると、すべてのゲーム状態が持続するはずですが、サーバがクラッシュしても10分ほどの変更が失われても問題ありません。NHibernateセッション管理?
私はNHibernateとSQLiteデータベースを使用することに決めました。そこで、NHibernateでチュートリアルやサンプルアプリケーションを書いて、多くのことを読んできました。
質問:私のセッションを管理するにはどうすればよいですか?ちょうど私が理解して、少量から、これらすべての可能性は私に飛び出し:
- は常に、すべてのクライアントが
- 接続し、定期的にフラッシュクライアントごとに単一のセッションを持っているを使用することを開いています、単一のセッションを持っていますそれは
- 私は永続化されたエンティティのいずれかを使用して、更新、挿入、削除、またはクエリが完了すると直ちに閉じる必要があるたびにセッションを開く
- クライアントごとにセッションを持ちますが、私がそれを使用する必要があるときにそれを再接続する
- サムE上記のように、それが接続され続けるとのみ変更をコミットするために、たとえば、それらを10分ごとに付けるだけ
- は実体が外れて保管する非アクティブの一定期間の後に、それを切断し、
戦略のどのような種類べき一度に何百ものクライアントから毎秒多くの更新、挿入、削除、およびクエリが発生する可能性があることを考えれば、まともなパフォーマンスを得るために使用します。
もう少し小さい質問:効率的な方法でトランザクションをどのように使うべきですか? 1回の変更がすべて自分のトランザクションになるのはいいですか、何百ものクライアントがグリッド内のセルを変更しようとしているときにうまく実行できませんか?同様のアップデートを一括して一括処理する方法を理解して、単一のトランザクション内に配置するか、それとも複雑になるのでしょうか?ほとんどの場合、トランザクションが必要なのでしょうか?
私はそれを最適化しようとしていません。私は、いろいろな方法が何をしているのか、それが一般的に良いか悪いのか、どれくらいうまく調整して実行しているのかなどを把握しようとしています。それは、私が馬鹿なことをしないで、合理的に賢明な解決策を選ぶことを確実にすることです。パフォーマンスチューニングではありません。 あなたの答えは、 "要求"とは何を意味しますか? "要求"は何ですか?プレイヤーが何かするたびにあなたは意味しますか? – IRBMe
リクエストありあり「プレイヤーが何かするたびに」または「クライアントからサーバーに電話するたびに」 – Paco
あなたが後で追加した編集内容を読んでいると、あなたが言ったことに関する1つの質問があります。クライアントごとに1つのセッションを持つことに関しては、NHibernateは、ISession.Findのようなメソッドが失効したデータを返すことはないと考えました。第二に、 "NHibernateはすでにビルドイン接続管理を持っている"ので、Reconnect/Disconnectを使用していないようですが、マニュアルでは "自動バージョン管理の長いセッション"という並行処理の例で使用しています。 – IRBMe