1

外部サービスに接続して新しい SMS を取得するアプリケーションを開発しています。これらのメッセージは、Hibernate によってローカル データベースに保存されます。私のクライアントは、時間、数などの多数のパラメーターに基づいてこれらのメッセージを検索できます。

「List1」というパラメーターのリストを使用して検索メソッドを呼び出した後、問題なく目的の結果が得られます。この結果を待っている間に、新しいメッセージが届きました。

その後すぐに、同じパラメーター リストを使用して検索メソッドを再度呼び出し、新しいメッセージも取得することを期待していますが、以前の結果が得られます。

データベースを確認したところ、新しいメッセージが存在するため、考えられるのは Hibernate キャッシュだけです。どちらのクエリもまったく同じなので、hibernate は以前と同じ結果セットを返すと思います。

私の仮定が正しい場合、どうすればこの問題を克服できますか? そうでない場合、正確に何が起こっているのですか?


編集

ここに私のソースコードの関連部分があります。クライアントが検索リクエストを開始すると、次の 2 つのメソッドが呼び出されます。

smsService.refresh();
JSONArray result = smsService.retrieveMessages(...);


@Transactional
public JSONArray retrieveMessages(Long periodBegining, Long periodEnd, String order, Integer limit, String profile, Boolean unread, String correspondent) {
    List<ShortMessage> messageList = shortMessageDAO.find(beginDate, endDate, order, limit, profile, unread, correspondent);
    JSONArray result = new JSONArray();
    for (ShortMessage message : messageList)
        result.put(message.toJSON());
    shortMessageDAO.markRead(messageList);
    return result;
}


@Transactional
public void refresh() {
    webService.authentication(serviceUsername, servicePassword);
    while(webService.hasUnread() > 0) {
        SMS sms = webService.retrieveMessage();
        ShortMessage message = new ShortMessage(sms.getHash(), sms.getFrom(), sms.getTo(), "DEFAULT", sms.getMessage(), new Date(sms.getTime()), true);
            shortMessageDAO.insert(message);
        }
    }
}


public List<ShortMessage> find(Date beginDate, Date endDate, String order, Integer limit, String profile, Boolean unread, String correspondent) {
    Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ShortMessage.class);
    criteria.add(Restrictions.ge("time", beginDate));
    criteria.add(Restrictions.le("time", endDate));
    criteria.add(Restrictions.eq("profile", profile));
    if (unread)
        criteria.add(Restrictions.eq("unread", true));
    if (correspondent != null)
        criteria.add(Restrictions.eq("origin", correspondent));
    criteria.addOrder(order.equals("ASC") ? Order.asc("time") : Order.desc("time"));
    criteria.setMaxResults(limit);
    criteria.setCacheMode(CacheMode.IGNORE);
    return (ArrayList<ShortMessage>) criteria.list();
}
4

2 に答える 2

0

はい、休止状態がクエリをキャッシュし、キャッシュされた結果を返しているようです。

より良い提案をするために、コードの概要を教えてください。

以下に、クエリのキャッシュ動作を制御する 2 つの方法を示します。

1) メインの名前付きクエリ レベル:-

@NamedQuery(
    name = "myNamedQuery"
    query = "SELECT u FROM USER WHERE u.items is EMPTY"
    hints = {@QueryHint(name = "org.hibernate.cacheMode", value = "IGNORE")}
)

2) 個々のクエリ レベル:-

Query q = session.createQuery("from User")
.setCacheMode(CacheMode.IGNORE);
于 2014-08-09T07:16:05.497 に答える
0

多数のテストを実行した後、この問題はキャッシュに関連していないことがわかりました。各メッセージを受信すると、自分のマシン時間ではなく、SMS パネルから提供されたデータに基づいて到着時刻を保存していました。

これら 2 つの間にわずかな時間差 (正確には 20 秒) があったため、クエリが新しく受信したメッセージを返さない理由がありました。

于 2014-08-10T18:41:00.580 に答える