私は、Windowsサービスとして実行されるアプリケーションを開発しています。いくつかのWCFサービス、クライアントGUIなどを含む他のコンポーネントがありますが、データベースにアクセスするのはWindowsサービスです。
そのため、このアプリケーションは長時間実行されるサーバーであり、パフォーマンスとスケーラビリティを向上させたいと考えていました。特に、データアクセスの向上を目指していました。第2レベルのキャッシュについて別のスレッドに投稿しました。
この投稿は、データベースにアクセスする長時間実行スレッドのセッション管理に関するものです。スレッド静的コンテキストを使用する必要がありますか?もしそうなら、それがどのように実装されるかの例はありますか?
NHibernateを使用しているネット上のすべての人は、Webアプリケーションスタイルのアーキテクチャに重点を置いているようです。Web以外のアプリの設計に関するドキュメント/ディスカッションが大幅に不足しているようです。
現時点では、私の長時間実行スレッドはこれを行います:
- 3つまたは4つのDAOメソッドを呼び出す
- 返された分離オブジェクトの状態を確認します。
- 必要に応じて状態を更新します。
- いくつかのDAOメソッドを呼び出して、更新されたインスタンスを永続化します。(オブジェクトのIDとインスタンス自体を渡します-DAOはDBからオブジェクトを再度取得し、トランザクションをコミットする前に更新された値とsession.SaveOrUpdate()を設定します。
- 'n'秒間スリープ
- もう一度繰り返してください!
したがって、以下は、各DAOメソッドに使用する一般的なパターンです。
- sessionFactory.OpenSession()を使用してセッションを開く
- トランザクションを開始します
- db作業を行います。取得/更新など
- トランスをコミットする
- (例外の場合のロールバック)
- 最後に、常にトランザクションとセッションを破棄します。Close()
これは、DAOクラスへのすべてのメソッド呼び出しで発生します。これは、私たちが行っているアンチパターンのようなものだと思います。
しかし、どうすればそれを改善できるかについて、どこにも十分な方向性を見つけることができません。
plsは、このスレッドがバックグラウンドで実行されている間、WCFクライアントから要求があり、それぞれが2〜3個のDAO呼び出しを行う可能性があることに注意してください。場合によっては、長時間実行されているスレッドが処理する同じオブジェクトをクエリ/更新します。 。
私たちのデザインを改善するためのアイデア/提案/ポインタは大歓迎です。良い議論ができれば、これをコミュニティwikiにして、http://nhibernate.infoからここにリンクすることもできます。
クリシュナ