4

私は現在、休止状態とスプリングを使用するクイズツールに取り組んでいます。私は実際にSakaiLMSツールとして構築しているので、この質問はもう少し複雑になりますが、一般化できるかどうかを確認します。

私の現在のシナリオは、ユーザーがStartQuizページに移動し、ページでフォームを送信すると、Attemptオブジェクト(休止状態で保存)を初期化する場合です。以下のオブジェクトにデータを入力します。

<class name="org.quiztool.model.Attempt" table="QT_ATTEMPTS">
    <cache usage="transactional" />

    <id name="id" type="long">
        <generator class="native">
            <param name="sequence">QT_ATTEMPTS_ID_SEQ</param>
        </generator>
    </id>
    <many-to-one name="quizId" class="org.quiztool.model.Quiz" cascade="none" />
    <property name="score" type="int" not-null="true" />
    <property name="outOf" type="int" not-null="true" />

    <list name="responses" cascade="none" table="QT_RESPONSES" lazy="false">
        <key column="id"/>
        <index column="idxr"/>
        <many-to-many class="org.quiztool.model.QuizAnswer" />
    </list>

    <list name="questionList" cascade="none" table="QT_ATTEMPT_QUESTIONS" lazy="false">
    <key column="id"/>
        <index column="idxq"/>
    <many-to-many class="org.quiztool.model.QuizQuestion" />
    </list>

    <property name="userId" type="string" length="99" />

    <property name="siteRole" type="string" length="99"  />
    <property name="startTime" type="java.util.Date" not-null="true" />
    <property name="finishTime" type="java.util.Date" />        
</class>

一連の質問をランダムに選択し、開始時刻とその他のいくつかのプロパティを設定し、休止状態でオブジェクトを保存した後、ユーザーをTakeTheQuizページにリダイレクトします。

TakeTheQuizページでは、リクエストパラメータとして渡されたIDで試行オブジェクトを読み込み、ユーザーがクイズに記入できるように、それを印刷してhtmlフォームにフォーマットします。約2/5の同時ユーザーには質問が表示されません。試行オブジェクトがロードされ、その質問は空です。

私の理論では、Attemptオブジェクトの質問リストは、データベースにすぐに挿入されていません(オブジェクトが休止状態のキャッシュに移動する限り問題ありません。その後、キャッシュから取得できますが、これはわかりません。方法を説明します)またはデータベースに保存していますが、TakeTheQuizページでのオブジェクトのロードがキャッシュから不完全なオブジェクトを読み取っています。

確かに私のHibernateの知識は限られているので、誰かがここで何が起こっているのか、そしてそれを修正する方法を理解するのを手伝ってくれるなら、私に知らせてください。

4

2 に答える 2

1

私が知ったように、答えは簡単でした。私の保存機能がデータベースに怠惰にコミットしているように見えました。各トランザクションの最後にそのオブジェクトのコミットを強制すると、問題は解決しました。

私は次のような独自のHibernateセッションコードを作成することになりました。

Session session = getSession();
session.beginTransaction();
session.saveOrUpdate(attempt);
session.getTransaction.commit();
session.close();

問題が解決しました。

于 2012-12-18T19:37:16.510 に答える
0

私の理論では、質問をランダムに選択するコードに何か問題があります。動作しますか?コードの一部を貼り付けてください。

2番目の理論は、トランザクションの境界に問題があるというものです。いつセッションをフラッシュしますか?そして、あなたの取引はいつコミットされますか?試してみて、セッションのFlushModeをALWAYSに設定してください。これは何かを変えますか?

于 2012-12-13T20:46:46.550 に答える