NHibernateで2番目のレベルのキャッシュを試しています。このコードで:
return session.Query<Payment>()
.Cacheable()
.OrderByDescending(payment => payment.Created)
.Skip((page - 1)*pageSize)
.Take(pageSize).ToArray();
エンティティがキャッシュにない場合は、次のようなクエリが実行されます。
select ... from Payment where Id = 1
select ... from Payment where Id = 2
select ... from Payment where Id = 3
100行が返される場合、これらのうち100行が実行されます。つまり、パフォーマンスの大きな問題です。このクエリだけを実行した方がよいでしょう。
select ... from Payment where Id in (1,2,3)
エンティティがキャッシュに存在しないのは、エンティティキャッシュが構成されていないか、キャッシュのサイズが制限されているか、キャッシュ内のエンティティの有効期限が切れているか、キャッシュから削除されていることが原因である可能性があります。
エンティティキャッシュに100%依存することを強制されないように、NHibernateがその「欠落している」エンティティデータをクエリする方法を変更することは可能ですか?