5

私はSpringが初めてで、Springが提供するすべてのものに非常に興奮しています!

現在、既存のプロジェクトでいくつかの DAO をモダナイズしようとしています。具体的には、古いプレーンな JDBC コードを Spring Jdbc サポートに置き換え、Spring の透過キャッシングを導入したいと考えています。

  1. @Cacheable最初の質問: DAO レイヤーが注釈を追加する適切な場所であるというのは正しいですか? それともビジネスレイヤーでやりますか?

  2. ネット上にあるすべての簡単な例に従うことができます。ただし、より現実的なコードになると、行き詰まります。

具体的には、モデルのインスタンスを返すメソッドがいくつかありますPublisher。私の手動キャッシュ実装では、異なるgetPublisher()メソッドに対して 1 つのインスタンスだけがキャッシュされ、フェッチされることを常に確認しました。ただし、@CacheableDAO内でキャッシングを使用してカプセル化しようとすると、ローカルメソッド呼び出しに対してアノテーションが機能しないという問題があります(プロキシのため)。

ここに私のサンプルコードがあります:

@Cacheable("publisherCache")
public Publisher getPublisher(int publisherId)
{
    String sql = "SELECT * FROM publisher LEFT JOIN publisherContacts USING (publisherId) WHERE publisherId=? ORDER BY publisherContactId ASC";
    return getJdbcTemplate().query(sql, publisherResultSetExtractor, publisherId);
}

public List<Publisher> findVisiblePublishers()
{
    List<Publisher> publishers = new LinkedList<Publisher>();
    for (int publisherId : findVisiblePublisherIds())
    {
        publishers.add(getPublisher(publisherId));
    }
    return publishers;
}

@Cacheable(value = "publisherCache", key = "'list'")
private List<Integer> findVisiblePublisherIds()
{
    String sql = "SELECT publisherId FROM publisher WHERE isVisible='yes' ORDER BY imprintName";
    return getJdbcTemplate().queryForList(sql, Integer.class);
}

public Publisher findNearestPublisher(String appx)
{
    appx = "%" + appx + "%";
    String sql = "SELECT publisherId FROM publisher WHERE publisherName LIKE ? OR imprintName LIKE ? ORDER BY imprintName DESC LIMIT 1";
    Integer publisherId = getJdbcTemplate().queryForObject(sql, Integer.class, appx, appx);
    if (publisherId == null)
        return null;
    else
        return getPublisher(publisherId);
}

これは私の考えでしたが、言ったようにうまくいきません。

私が今見ることができる唯一の選択肢は次のとおりです。

a) メソッドのみをキャッシュし、s を返すgetPublisher(publisherId)他のすべてのメソッドをs (publisherIds) またはそのリストを返すように定義します。これは API の観点からは不自然です。サービスまたはビジネス ロジックとして、ID だけでなく、DAO からインスタンスを取得することを期待します。Publisherint

b)@Cacheableすべてのメソッドに追加し、キャッシュを複製し、必要以上のメモリを使用します (多くのパブリッシャーがあり、それらが重いオブジェクトであると仮定します)。

このかなり一般的な問題のベストプラクティスは何ですか? 洞察をありがとう。

4

1 に答える 1