私はSpringが初めてで、Springが提供するすべてのものに非常に興奮しています!
現在、既存のプロジェクトでいくつかの DAO をモダナイズしようとしています。具体的には、古いプレーンな JDBC コードを Spring Jdbc サポートに置き換え、Spring の透過キャッシングを導入したいと考えています。
@Cacheable
最初の質問: DAO レイヤーが注釈を追加する適切な場所であるというのは正しいですか? それともビジネスレイヤーでやりますか?ネット上にあるすべての簡単な例に従うことができます。ただし、より現実的なコードになると、行き詰まります。
具体的には、モデルのインスタンスを返すメソッドがいくつかありますPublisher
。私の手動キャッシュ実装では、異なるgetPublisher()
メソッドに対して 1 つのインスタンスだけがキャッシュされ、フェッチされることを常に確認しました。ただし、@Cacheable
DAO内でキャッシングを使用してカプセル化しようとすると、ローカルメソッド呼び出しに対してアノテーションが機能しないという問題があります(プロキシのため)。
ここに私のサンプルコードがあります:
@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 からインスタンスを取得することを期待します。Publisher
int
b)@Cacheable
すべてのメソッドに追加し、キャッシュを複製し、必要以上のメモリを使用します (多くのパブリッシャーがあり、それらが重いオブジェクトであると仮定します)。
このかなり一般的な問題のベストプラクティスは何ですか? 洞察をありがとう。