二级缓存始终与Session Factory对象相关联。在运行事务时,它在Session Factory级别加载对象,以便这些对象将对整个应用程序可用,而不仅仅是单个用户。由于对象已经加载到缓存中,因此每当查询返回一个对象时,就无需进行数据库事务。
必须为要缓存的每个单独实体类启用并配置二级缓存。因此,需要启用缓存来缓存映射到15个表的15个对象。
在XML中,这是在元素内完成的:
<cache usage="read-write"/>
在Fluent NHibernate(非自动映射)中,它是在ClassMap构造函数或您放置其余映射代码的任何位置完成的:
Cache.ReadWrite().Region("Configuration");
从这里开始,这取决于数据库的大小和负载,以及新数据必须存在的方式。
如果数据库相对较小且写入较少,则可以在每次写入/更新时更新缓存。
ISession.Clear();
ReloadCache();
如果数据库非常庞大:
并且您每天只需更新一次数据库,比如在12点,并将“新”数据保存在缓存中一天,那么您也可以。重新加载时,一些用户会出现延迟峰值。
这是一个例子:
http://www.codeproject.com/Articles/529016/NHibernate-Second-Level-Caching-Implementation
如果您的数据库非常庞大且用户必须获取更新的数据,则必须手动更新缓存中的数据。
Database db = new Database ();
Transaction tx = db.BeginTransaction ();
try
{
// Read from the cache
MyEntity1 entity1 = cache.Get <MyEntity1> ("pk of entity1");
// Cache is not read from the database
if (entity1 == null) entity1 = db.Get <MyEntity1> ("pk of entity1");
// Entity1 processing
updated = db.Update, (entity1); / / entity1 update saved to the database
if (updated) cache.Put (entity1); / / database update successfully, the update cache
// Transaction processing
tx.commit ();
}
catch
{
tx.Rollback ();
throw;
}
更多相关信息请查看这里:http://www.databaseskill.com/3093355/