2

DAO とセッションに関する多くの質問を読みましたが、問題がわかりません。現在、私は次のようなものを使用しています:コア DAO (コア DAO にいくつかの追加チェックを追加しました) と、ウィケット フレームワークに基づく Web プロジェクトのDAO 実装。一般に、このパターンは次のように記述できます。

1) 1 スレッドあたり 1 セッションを使用する。

2) セッションを閉じないでください。

3) アクションの後、常にトランザクションをコミットします。

DDoS ユーティリティとこの実装作業 (1 秒あたり 100 接続) を使用してテストします。しかし、接続数を増やすと、セッションを閉じてトランザクションを開始しないという例外がたくさんあります。openSession() の代わりに getCurrentSession() を使用する必要があることを理解する方法ですが、getCurrentSession() を使用してコア DAO のメソッド getSession() を変更したとき、バグを修正しませんでした :(。次に、c3p0 と bonecp を使用しようとしました。しかし、それらは強力なツールは私を助けませんでした.多分あなたは私の間違いを説明します:( DNAのバグを除いて

4

2 に答える 2

3

どこからでもコピーした DAO は、休止状態のセッションを ThreadLocal オブジェクトに格納します。つまり、1 つの休止状態セッションが 1 つのスレッドにバインドされます。

しかし、あなたは Web プロジェクトを行っています。そこで、1 つの Hibernate セッションを 1 つのユーザー (またはブラウザー)、つまり 1 つの Http セッションにバインドする必要があります。ただし、1 つの http セッションからの要求がどのスレッドで処理されるかはわかりません。したがって、ソリューションでは、同じ Http セッションが異なる Hibernate セッションを取得するか、異なる HTTP セッションが同じ Hibernate セッションを取得する可能性があります。これは、HTTP サーバーによって異なります。

解決策: Hibernate セッションを Http セッションに入れます ( ThreadLocal オブジェクトを使用しないでください)。と を使用して Http セッション オブジェクトを取得し、HttpServletRequest.getSession()/HttpSession.getAttribute()HttpSession.setAttribute()使用して Hibernate セッションとその他の Http セッション関連データを設定できます。

于 2012-04-19T07:31:29.197 に答える
0

この質問にはすでに答えがありますが、将来ここに来る人(私のように)に対処する方法をさらに考えてください。

現在、ステートレスな Restful API を実装しているため、セッションを使用したり、ユーザーとサーバーの間に何らかのリンクを設定したりしたくありません。この問題に対する私の解決策は、フィルター (トランザクションのコミットまたはロールバックに使用されるものと同じもの) を使用して、各要求の後に EntityManager をクリーンアップすることでした。基本的にアプリケーションからキャッシングを削除しますが、同じトランザクション内でのみキャッシングが必要なので、まったく問題なく望ましいものです。

于 2015-06-04T14:28:21.420 に答える