Кэш первого уровня
Этот кеш включен по умолчанию.
Когда NHibernate загружает объект по его уникальному идентификатору из базы данных, он автоматически помещается в так называемую карту идентификации. Эта карта идентичности представляет кэш первого уровня.
Время жизни кэша первого уровня связано с текущим сеансом. Как только текущий сеанс закрывается, содержимое соответствующего кэша первого уровня очищается. Как только объект находится в кеше первого уровня, последующая операция, которая хочет загрузить тот же объект в текущем сеансе, извлекает этот объект из кеша, и не требуется обратная передача в базу данных.
Одна из основных причин этой карты сущностей состоит в том, чтобы избежать ситуации, когда два разных экземпляра в памяти могут представлять одну и ту же запись базы данных (или сущность).
(адаптировано из FAQ по NH)
Кэш второго уровня
Этот кеш находится выше кеша одного сеанса. С помощью этого кэша вы сохраняете много обращений в базу данных, так как каждый раз, когда кто-либо в любом сеансе загружает определенный объект, он остается в кэше, поэтому следующий запрос (из любого другого сеанса) получит его из кэша.
Для использования L2 Cache вам потребуется поставщик кеша, такой как SysCache или Memcache. Эти парни будут хранить значения кэшированных сущностей в виде массива строк, хэшированных идентификатором сущности. Важно отметить, что кешируется не объект .net, а только его значения.
Говорят, что он привязан к фабрике сеансов, потому что кеш будет работать для сеансов, созданных определенной фабрикой сеансов, поэтому сеансы, созданные разными фабриками сеансов, не будут совместно использовать кеш. Вам понятна концепция фабрики сессий?
Кэш запросов
Это действительно просто, но есть одна загвоздка. Он будет кэшировать запрос и его параметры, но не будет кэшировать возвращаемые объекты. Он будет кэшировать только их идентификаторы, поэтому он имеет смысл только для кэша L2, поскольку содержит значения, связанные с этим идентификатором.
FAQ NHiernate о кэше:
https://web.archive.org/web/20110514214657/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/09/first-and-second-level-caching-in-nhibernate.aspx