1

データベースからデータを取得して表示する Web アプリケーションがあります。今私が抱えている問題は、データベース内のデータを毎時間更新したいということです。これは別のアプリによって行われ、これはすべて正常に機能します。ただし、これが発生し、ユーザーが Web ページを更新すると、新しいデータは表示されません。

これが理にかなっていることを願っています。

見やすいように、アプリからいくつかのコードを提供します。

私の Web アプリケーションは Java を使用して NetBeans で作成されており、データベース内のテーブルにクラスをマッピングする永続ユニットがあります。コンポーネントをHTMLに追加するためにウィケットを使用しています。

// Java ウィケット コード

ApplicationSettings apset = new ApplicationSettingsDAO().getApplicationSettings();    
this.add(new Label("lblGameTime", "" + apset.getGameTimeDays()));

// 改札の HTML コード

Date : day <span wicket:id="lblGameTime">generated date</span>

// データベースから設定オブジェクトを取得し、それを上記の Java Wicket コードに返す DAO アプリケーション設定

public ApplicationSettings getApplicationSettings() {

    ApplicationSettings settings;

    try {
     Query q = manager.createQuery("select s from ApplicationSettings s where s.setting = :setting");
     q.setParameter("setting", "setting");
     settings = (ApplicationSettings) q.getSingleResult();
  } catch (NoResultException e) {
     ApplicationSettings newSetting = new ApplicationSettings();
     return newSetting;
  }
     return settings;

}

//ApplicationSettings は単なるクラスです。

//毎時コードは、動作してデータベースを更新する別のアプリで実行されました

Query query6 = manager.createQuery("select s from ApplicationSettings s where s.setting = :setting");
    query6.setParameter("setting", "setting");
    ApplicationSettings apset = (ApplicationSettings) query6.getSingleResult();
    apset.setGameTimeDays(apset.getGameTimeDays() + 1);
    save(apset);

ユーザーがページを再度ロードすると、上記のJava ウィケット コードを呼び出すため、ページがデータベースからデータを再度取得するため、 gameTimeDaysが正しいと期待できます。しかし、値は変わりません。ページに表示される値は、更新前の古い古い値です。何度更新しても、この値は古い値のままです。ただし、Tomcat サーバーでモジュールを再デプロイまたは再起動すると、その時点で値が正しくなります。

私が見逃しているのは何ですか、これは答えが私をほのめかしているように見える小さな問題です。

サーバーが再デプロイされるまで、値はメモリに保存されているようです。これについて知るために、Javaの内部の仕組みについてあまり知りません。

わかりました、誰かが私のジレンマを手伝ってくれるのに十分な情報を提供したことを願っています.

助けてくれてありがとう。

編集:永続化ライブラリはTopLink Essentialsです

4

2 に答える 2

1

あなたが使用している永続化メカニズムによってデータがキャッシュされているようです(詳細は開示していません)。これは Java の機能ではなく、Hibernate などの特定の永続化フレームワークの機能です。

永続化プロバイダーについて詳しく教えていただければ、より具体的なアドバイスができるかもしれません。

于 2011-01-23T20:56:51.153 に答える
1

persistence.xml プロパティを使用してTopLinkの共有キャッシュを無効にできます。

または、エンティティごとに無効にするか、更新またはキャッシュの無効化を使用します。

EclipseLink プロバイダーは、より多くのキャッシング オプションを提供し、JPA 2.0 キャッシング API を実装します。

http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

于 2011-02-08T14:35:20.317 に答える