在许多项目应用中,我们设计的数据库中的一些表中的数据变化的频率很慢,比如,我们有个GameInformation表保存所有已上线的游戏的信息,这个表中的数据变动的频率就很小(因为可能一两个月才会有个新游戏上线或偶尔修改一下已上线游戏的具体信息(通常都是不需紧急更新的)),而且,这个表中的数据又经常被用到,比如根据GameID获取游戏的名字、简介等等。这种表就很适合缓存在内存中,这样可以提供更好的性能和有效地降低数据库的负载。
DataRabbit.Application.Cache命名空间提供了对Entity缓存的支持,并且能够定时刷新缓存(如每隔15分钟刷新一次)。
首先,在框架中,Entity缓存(EntityCache)是通用Cache的一种,我们来看看,框架对缓存(ESBasic.Cache.ICache接口)的定义:
publicinterfaceICache
{
boolEnabled{get;set;}
voidInitialize();
voidRefresh();
eventCbSimpleCacheRefreshed;
}
其次,ESBasic.Cache命名空间下有个ICacheManager,它用于管理所有缓存(Cache)实例,而且定时刷新每个缓存的功能也是它提供的。其接口定义如下:
publicinterfaceICacheManager
{
///<summary>
///RefreshSpanInSecs定时刷新缓存的时间间隔
///</summary>
intRefreshSpanInSecs{set;}
IList<ICache>CacheList{set;}
voidInitialize();
voidRefreshNow();
voidAddCache(ICachecache);
voidRemoveCache(ICachecache);
voidRemoveCaches();
eventCbCacheExceptionCacheRefreshFailed;
}
ESBasic.Cache.CacheManager类实现了该接口。
现在,有了基础缓存接口和缓存管理器的支持,我们就可以在其基础上实作实体缓存(EntityCache)。
首先,一个实体Entity要能被缓存,该Entity必须实现ICachedEntity泛型接口:
///<summary>
///ICachedEntity可以被缓存的Entity
///</summary>
///<typeparamname="TPKey">主键的类型</typeparam>
publicinterfaceICachedEntity<TPKey>
{
TPKeyGetID();
}
那么,实体缓存可以提供哪些操作了?简单想一下,我们就可以知道,比如获取所有缓存的Entity,根据ID获取Entity,等等。IEntityCache接口中定义了这些功能:
///<summary>
///IEntityCache从数据库中获取符合条件的Entity并缓存起来。2007.07.07
///</summary>
///<typeparamname="TPKey">对应的数据表的主键类型</typeparam>
///<typeparamname="TEntity">Entity类型</typeparam>
publicinterfaceIEntityCache<TPKey,TEntity>:ICachewhereTEntity:class,ICachedEntity<TPKey>
{
///<summary>
///GetEntity获取目标Entity,如果缓存中不存在,则刷新缓存,如果还招不到,则返回null。
///</summary>
TEntityGetEntity(TPKeyentityID);
IList<TEntity>GetEntityList();
TransactionScopeFactoryTransactionScopeFactory{set;}
CacheRefreshModeCacheRefreshMode{set;}
}
///<summary>
///CacheRefreshMode缓存刷新模式:全部替换、增量。
///</summary>
publicenumCacheRefreshMode
{
ReplaceAll,
Increasement
}
DataRabbit.Application.Cache.EntityCache类实现了该接口,并且提供了虚方法CreateFilterTree来让派生类来提供一系列条件,只有符合这些条件的Entity才会从数据库中取出来缓存。CreateFilterTree方法定义如下:
#regionCreateFilterTree
///<summary>
///SetFilterTree派生类可以通过此方法设置要缓存的对象的条件,返回null,表示缓存表中的所有Entity
///</summary>
protectedvirtualIFilterTreeCreateFilterTree()
{
returnnull;
}
#endregion
下面举一个例子来说明实体缓存的应用。
比如,我需要缓存所有启用的GameInformation。
首先,让GameInformation实体类从ICachedEntity继承:
publicpartialclassGameInformation:ICachedEntity<string>
{
//
}
GameInformation表的主键ID是字符串类型。
接下来,从DataRabbit.Application.Cache.EntityCache继承得到具体的缓存类GameInfoCache:
publicclassGameInfoCache:EntityCache<string,GameInformation>
{
protectedoverrideIFilterTreeCreateFilterTree()
{
//取出所有启用的游戏信息
returnnewSimpleFilterTree(LogicType.And,newFilter(GameInformation._Enabled,true));
}
}
最后,我们通过Spring.net来配置缓存管理器和实体缓存即可,假设我们让缓存管理器每15分钟(900s)刷新一次。
<objectname="gameInfoCache"type="GameRabbit.Entity.Cache.GameInfoCache,GameRabbit.Entity"init-method="Initialize">
<propertyname="Enabled"value="true"/>
<propertyname="TransactionScopeFactory"ref="transactionScopeFactory"/>
<propertyname="CacheRefreshMode"value="ReplaceAll"/>
</object>
<objectname="cacheManager"type="ESBasic.Cache.CacheManager,ESBasic"init-method="Initialize">
<propertyname="RefreshSpanInSecs"value="900"/>
<propertyname="CacheList">
<listelement-type="ESBasic.Cache.ICache,ESBasic">
<refobject="gameInfoCache"/>
</list>
</property>
</object>
如此即可。上述的介绍不仅用到的DataRabbit中的类,而且也用到了ESBasic中的相关组件,不用担心,我在
DataRabbit 轻量的ORM框架(00) -- 序一文的末尾提供的DataRabbit3.0下载中包含了必须的ESBasic动态库。可以从那里下载,来试试EntityCache的方便性。
分享到:
相关推荐
DoNet4.0 ORM框架NHibernate-4.1.1,注意。该版本编译环境为.net4.0
一个自建的Java应用开发ORM框架,名为Integ,有分页查询功能,有很好的灵活度和扩展性。此为第一期的代码,后续还会增强。欢迎下载,欢迎批评指正。
EF-ORM是一个轻量,便捷的Java ORM框架。并且具备若干企业级的应用特性,如分库分表、JTA事务等。 代码生成插件for eclipse(请在eclipse中Help/Install new software后输入地址并安装)...
一个自建的Java应用开发ORM框架,名为Integ,有分页查询功能,有很好的灵活度和扩展性。此为第一期的代码,后续还会增强。欢迎下载,欢迎批评指正。(昨天上传的代码过期了,以这个版本为准)
ORM框架-三层架构完整程序代码.pdf
一款轻量级的ORM框架。
VB/C#.Net实体代码生成工具(EntitysCodeGenerate)【ECG】是一款专门为VB/C#.Net数据库程序员开发量身定做的(ORM框架)代码生成工具,所生成的代码基于面向对象、分层架构设计、ORM并参考微软Petshop中的经典思想,...
Sqlite ORM 是一个简单的C#类,对Sqlite的操作进行了封装,主要功能包括:表定义、生成,访问,更新等,其中,支持,多表的连接操作,语法类似Linq语法,使用非常方便,附加了使用说明文档。 例如,添加记录操作为...
ORM框架-三层架构 完整代码实现 通过解析实例,讲述ORM框架,采用三层架构实现功能。
This project is based on Java, is a lightweight ORM model. Only concerned about the Object-Relationl Mapping, therefore more simple and easier to use, easier to control. Key support functions and ...
Ujorm 它是一个高性能的开源Java ORM框架,尤其针对持久层的快速开发,在搜索查询的测试中,Ujorm的运行速度比其他竞争产品要快很多。 Ujorm在很多方面展开创新,在和Hibernate的比较中,Ujorm也拥有一些优势。...
资源分类:Python库 所属语言:Python 资源全名:SQLAlchemy-ORM-tree-0.0.7.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Java反射机制在数据持久层轻量级ORM框架中的应用研究.pdf
Spring整合其他ORM框架:Spring整合其他ORM框架整合的时候所需要的jar包spring-orm-3.2.0.RELEASE.jar
ActiveAndroid算是一个轻量级的ORM框架,简单地通过如save()和delete()等方法来做到增删改查等操作。配置起来也还算简单。 示例代码: @Table(name = "Categories") public class Category extends Model { @...
sqltoy-orm是比hibernate+myBatis更加贴合项目的orm框架,具有hibernate增删改的便捷性同时也具有比myBatis更加灵活优雅的自定义sql查询功能。 sqltoy-orm支持以下数据库: oracle 从oracle11g到19c db2 9.5+,建议从...
Android应用源码开发Demo,主要用于毕业设计学习。
不用写sql啦,不用创建表啦,一个比mybatis更轻量级,比hibernate好用的orm!
轻量级orm框架,灵活在于可以自己编写复杂的SQL语句查询,简单在于几分钟内便能上手使用,并支持mysql, mssql, oracle, sqlite数据库
python库,解压后可用。 资源全名:python_redis_orm-0.4.0-py3-none-any.whl