缓存策略
① 如何关闭写入缓存(在策略下字体是灰色,关不掉
楼上的貌似是改动虚拟内存吧。关闭写入缓存应该右击我的电脑--属性--硬件--设备管理器--找到你的设备--右击选择属性--策略--为快速删除而优化。就可以了。不过貌似默认就是这样的。
② mybatis缓存机制中,默认的回收策略是哪个
Mybatis缓存处理机制 MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后
③ 如何使用缓存
缓存是分层次的,下面是计算机缓存山:
cpu缓存策略:
寄存器中计算数据,而数据存储在内存中,由于cpu和内存之间的性能逐渐增大,系统设计者在cpu和内存之间插入了3层的高速缓存。高速缓存有三个层级,就是整个计算机缓存系统的一个小缩影。
④ 如何有效实现依赖Oracle的缓存策略
ASP.NET 中的缓存提供了对sql依赖项的支持,也就是说当SQL SERVER数据库中的表或行中的数据被更改后,缓存中的页面就失效,否则,页面输出可一直保留在缓存当中。这确实为程序员提供了方便。但微软一向很小家子气,只为使用自家产品SQL SERVER的程序员提供了方便,那些用Oracle数据库的ASP.NET程序员怎么办呢?
其实不用着急,因为ASP.NET中的缓存还提供了对文件依赖项的支持,也就是缓存依赖于某个文件,该文件被修改后,缓存中的页面就失效。只要巧妙利用ASP.NET的文件依赖项缓存策略和Oracle中的触发器,就可轻松实现依赖Oracle的缓存策略。思路很简单,先将页面的缓存策略设置为依赖某一个文件,再为Oracle中需要依赖的表添加一个触发器,当表中的数据被更改时,修改缓存所依赖的文件中的内容。
下面以一个小例子来具体说明:
试验目的:Default.aspx页面的缓存依赖于Oracle数据库中SCOTT用户的DEPT表,该表中数据被更改后,缓存中的页面失效。缓存的过期时间为120秒。
一、设置网站页面的缓存依赖于文件TextFile.txt详见System.Web.Caching.Cache类 Asp.NET缓存 各种缓存依赖二、在Oracle数据库中创建触发器
1、触发器被触发时执行PL/SQL代码块。PL/SQL代码块直接读写操作系统中的文件,需调用内置的utl_file程序包。这需要先修改Oracle的初始化参数文件INIT.ORA,在其中添加参数utl_file_dir,来指定文件的目录。修改INIT.ORA文件后,需重启Oracle数据库,设置的参数才能生效。
在INIT.ORA文件中添加下面一行内容:
utl_file_dir='E:/CSharp/CacheByOracleDependncy'
也可以设置为utl_file_dir=*,不指定具体目录,即任何目录都可以。
如果是Oracle 9i数据库,还有一种方法也能起到同样的作用:在sys用户下创建一个directory目录(实际上是在sys用户下的dir$表中增加一个对应的OS_PATH),然后将对该directory对象的读/写操作的权限grant给public。
[sql] view plain
create or replace directory FILEPATH as 'E:/CSharp/CacheByOracleDependncy';grant read on directory FILEPATH to public;这里我使用的是第二种方法。
2、为所依赖的表(SCOTT用户的DEPT表)创建一个触发器:当DEPT表中的数据更改后,触发器就会将当前系统时间写入TextFile.txt文件中。
[sql] view plain
CREATE OR REPLACE TRIGGER
"SCOTT"."TEST_CACHE_BY_ORACLE_DEPENDNCY" AFTERINSERT
OR UPDATE
OR DELETE OF "DEPTNO", "DNAME", "LOC" ON "SCOTT"."DEPT" DECLAREfile_handle utl_file.file_type;
BEGIN
--打开文件
file_handle := utl_file.fopen('FILEPATH','TextFile.txt','w');--将当前系统时间写入文件
IF utl_file.is_open(file_handle) THEN
utl_file.put_line(file_handle,to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));END IF;
--关闭文件
utl_file.fclose(file_handle);
EXCEPTION
WHEN OTHERS THEN
BEGIN
IF utl_file.is_open(file_handle) THEN
utl_file.fclose(file_handle);
END IF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
END;
如果应用服务器和数据库服务器不是同一台服务器可能会遇到项目无法成功访问文件进行依赖的情况:
解决方法详见ASP.Net访问网络驱动器(映射磁盘)
⑤ JAVA几种缓存技术介绍说明
1、TreeCache / JBossCache
JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能。缓存数据被自动复制,让你轻松进行JBoss服务器之间 的集群工作。JBossCache能够通过JBoss应用服务或其他J2EE容器来运行一个MBean服务,当然,它也能独立运行。
2、WhirlyCache
Whirlycache是一个快速的、可配置的、存在于内存中的对象的缓存。它能够通过缓存对象来加快网站或应用程序的速度,否则就必须通过查询数据库或其他代价较高的处理程序来建立。
3、SwarmCache
SwarmCache是一个简单且有效的分布式缓存,它使用IP multicast与同一个局域网的其他主机进行通讯,是特别为集群和数据驱动web应用程序而设计的。SwarmCache能够让典型的读操作大大超过写操作的这类应用提供更好的性能支持。
4、JCache
JCache是个开源程序,正在努力成为JSR-107开源规范,JSR-107规范已经很多年没改变了。这个版本仍然是构建在最初的功能定义上。
5、ShiftOne
ShiftOne Java Object Cache是一个执行一系列严格的对象缓存策略的Java lib,就像一个轻量级的配置缓存工作状态的框架。
⑥ 静态html文件缓存策略是什么意思
一个简单的例子
比如访问新闻页面,如果不使用该方法,那每个用户访问的时候,都要去查询数据库。而如果使用该策略,在服务器端先生成一个静态的html文件,那用户访问的时候就不需要查询数据库了。
至于更新,可以有服务器定时去查询数据库重新生成html文件。
纯属个人想法。。
⑦ 磁盘写入缓存策略开还是关
在一定程度上提高硬盘的读写速度,开启该功能,甚至少有磁盘碎片产生,但有优点必然有缺点,硬盘写入缓存的知名缺点就是突然断电的计算机,不能很好的保证数据的完整性。
Win10启用磁盘写入缓存的方法:
1、首先按Win+X键,或右击开始按钮,在弹出的菜单中点击“设备管理器”;
2、在弹出的硬盘属性窗口中,切换至“策略”项,勾选“启用设备上的写入缓存”,点击确定即可。(如果想关闭此功能,则取消勾选即可)。
⑧ 存,缓存命中如何,另外它本身没有什么缓存策略,而是依赖所用的网络库的缓存策
很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了。我的经验主要来自hibernate2.1版本,基本原理和3.0、3.1是一样的,请原谅我的顽固不化。hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了。二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等,需要设置hibernate.cache.provider_class,我们这里用ehcache,在2.1中就是hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider如果使用查询缓存,加上hibernate.cache.use_query_cache=true缓存可以简单的看成一个Map,通过key在缓存里面找value。Class的缓存对于一条记录,也就是一个PO来说,是根据ID来找的,缓存的key就是ID,value是POJO。无论list,load还是iterate,只要读出一个对象,都会填充缓存。但是list不会使用缓存,而iterate会先取数据库selectid出来,然后一个id一个id的load,如果在缓存里面有,就从缓存取,没有的话就去数据库load。假设是读写缓存,需要设置:如果你使用的二级缓存实现是ehcache的话,需要配置ehcache.xml其中eternal表示缓存是不是永远不超时,timeToLiveSeconds是缓存中每个元素(这里也就是一个POJO)的超时时间,如果eternal="false",超过指定的时间,这个元素就被移走了。timeToIdleSeconds是发呆时间,是可选的。当往缓存里面put的元素超过500个时,如果overflowToDisk="true",就会把缓存中的部分数据保存在硬盘上的临时文件里面。每个需要缓存的class都要这样配置。如果你没有配置,hibernate会在启动的时候警告你,然后使用defaultCache的配置,这样多个class会共享一个配置。当某个ID通过hibernate修改时,hibernate会知道,于是移除缓存。这样大家可能会想,同样的查询条件,第一次先list,第二次再iterate,就可以使用到缓存了。实际上这是很难的,因为你无法判断什么时候是第一次,而且每次查询的条件通常是不一样的,假如数据库里面有100条记录,id从1到100,第一次list的时候出了前50个id,第二次iterate的时候却查询到30至70号id,那么30-50是从缓存里面取的,51到70是从数据库取的,共发送1+20条sql。所以我一直认为iterate没有什么用,总是会有1+N的问题。(题外话:有说法说大型查询用list会把整个结果集装入内存,很慢,而iterate只selectid比较好,但是大型查询总是要分页查的,谁也不会真的把整个结果集装进来,假如一页20条的话,iterate共需要执行21条语句,list虽然选择若干字段,比iterate第一条selectid语句慢一些,但只有一条语句,不装入整个结果集hibernate还会根据数据库方言做优化,比如使用mysql的limit,整体看来应该还是list快。)如果想要对list或者iterate查询的结果缓存,就要用到查询缓存了查询缓存首先需要配置hibernate.cache.use_query_cache=true如果用ehcache,配置ehcache.xml,注意hibernate3.0以后不是net.sf的包名了然后query.setCacheable(true);//激活查询缓存query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion,可选第二行指定要使用的cacheRegion是myCacheRegion,即你可以给每个查询缓存做一个单独的配置,使用setCacheRegion来做这个指定,需要在ehcache.xml里面配置它:如果省略第二行,不设置cacheRegion的话,那么会使用上面提到的标准查询缓存的配置,也就是net.sf.hibernate.cache.StandardQueryCache对于查询缓存来说,缓存的key是根据hql生成的sql,再加上参数,分页等信息(可以通过日志输出看到,不过它的输出不是很可读,最好改一下它的代码)。比如hql:fromCatcwherec.namelike?生成大致如下的sql:select*fromcatcwherec.namelike?参数是"tiger%",那么查询缓存的key*大约*是这样的字符串(我是凭记忆写的,并不精确,不过看了也该明白了):select*fromcatcwherec.namelike?,parameter:tiger%这样,保证了同样的查询、同样的参数等条件下具有一样的key。现在说说缓存的value,如果是list方式的话,value在这里并不是整个结果集,而是查询出来的这一串ID。也就是说,不管是list方法还是iterate方法,第一次查询的时候,它们的查询方式很它们平时的方式是一样的,list执行一条sql,iterate执行1+N条,多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候,就都和iterate的行为一样了,根据缓存的key去缓存里面查到了value,value是一串id,然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。可以看出来,查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候,都是既填充查询缓存又填充class缓存的。这里还有一个很容易被忽视的重要问题,即打开查询缓存以后,即使是list方法也可能遇到1+N的问题!相同条件第一次list的时候,因为查询缓存中找不到,不管class缓存是否存在数据,总是发送一条sql语句到数据库获取全部数据,然后填充查询缓存和class缓存。但是第二次执行的时候,问题就来了,如果你的class缓存的超时时间比较短,现在class缓存都超时了,但是查询缓存还在,那么list方法在获取id串以后,将会一个一个去数据库load!因此,class缓存的超时时间一定不能短于查询缓存设置的超时时间!如果还设置了发呆时间的话,保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况,比如class缓存被程序强制evict了,这种情况就请自己注意了。另外,如果hql查询包含select字句,那么查询缓存里面的value就是整个结果集了。当hibernate更新数据库的时候,它怎么知道更新哪些查询缓存呢?hibernate在一个地方维护每个表的最后更新时间,其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。当通过hibernate更新的时候,hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表,当hibernate查询一个缓存是否存在的时候,如果缓存存在,它还要取出缓存的生成时间和这个缓存所查询的表,然后去查找这些表的最后更新时间,如果有一个表在生成时间后更新过了,那么这个缓存是无效的。可以看出,只要更新过一个表,那么凡是涉及到这个表的查询缓存就失效了,因此查询缓存的命中率可能会比较低。Collection缓存需要在hbm的collection里面设置假如class是Cat,collection叫children,那么ehcache里面配置Collection的缓存和前面查询缓存的list一样,也是只保持一串id,但它不会因为这个表更新过就失效,一个collection缓存仅在这个collection里面的元素有增删时才失效。这样有一个问题,如果你的collection是根据某个字段排序的,当其中一个元素更新了该字段时,导致顺序改变时,collection缓存里面的顺序没有做更新。缓存策略只读缓存(read-only):没有什么好说的读/写缓存(read-write):程序可能要的更新数据不严格的读/写缓存(nonstrict-read-write):需要更新数据,但是两个事务更新同一条记录的可能性很小,性能比读写缓存好事务缓存(transactional):缓存支持事务,发生异常的时候,缓存也能够回滚,只支持jta环境,这个我没有怎么研究过读写缓存和不严格读写缓存在实现上的区别在于,读写缓存更新缓存的时候会把缓存里面的数据换成一个锁,其他事务如果去取相应的缓存数据,发现被锁住了,然后就直接取数据库查询。在hibernate2.1的ehcache实现中,如果锁住部分缓存的事务发生了异常,那么缓存会一直被锁住,直到60秒后超时。不严格读写缓存不锁定缓存中的数据。使用二级缓存的前置条件你的hibernate程序对数据库有独占的写访问权,其他的进程更新了数据库,hibernate是不可能知道的。你操作数据库必需直接通过hibernate,如果你调用存储过程,或者自己使用jdbc更新数据库,hibernate也是不知道的。hibernate3.0的大批量更新和删除是不更新二级缓存的,但是据说3.1已经解决了这个问题。这个限制相当的棘手,有时候hibernate做批量更新、删除很慢,但是你却不能自己写jdbc来优化,很郁闷吧。SessionFactory也提供了移除缓存的方法,你一定要自己写一些JDBC的话,可以调用这些方法移除缓存,这些方法是:voidevict(ClasspersistentClass)Evictallentriesfromthesecond-levelcache.voidevict(ClasspersistentClass,Serializableid)Evictanentryfromthesecond-levelcache.voidevictCollection(StringroleName)Evictallentriesfromthesecond-levelcache.voidevictCollection(StringroleName,Serializableid)Evictanentryfromthesecond-levelcache.voidevictQueries().voidevictQueries(StringcacheRegion).不过我不建议这样做,因为这样很难维护。比如你现在用JDBC批量更新了某个表,有3个查询缓存会用到这个表,用evictQueries(StringcacheRegion)移除了3个查询缓存,然后用evict(ClasspersistentClass)移除了class缓存,看上去好像完整了。不过哪天你添加了一个相关查询缓存,可能会忘记更新这里的移除代码。如果你的jdbc代码到处都是,在你添加一个查询缓存的时候,还知道其他什么地方也要做相应的改动吗?----------------------------------------------------总结:不要想当然的以为缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的,不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用,可能会有1+N的问题。不当的使用还可能导致读出脏数据。如果受不了hibernate的诸多限制,那么还是自己在应用程序的层面上做缓存吧。在越高的层面上做缓存,效果就会越好。就好像尽管磁盘有缓存,数据库还是要实现自己的缓存,尽管数据库有缓存,咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么,只能做的比较通用,而高层可以有针对性的实现缓存,所以在更高的级别上做缓存,效果也要好些吧。参考资料:/topic/18904
⑨ 常见的缓存策略有哪些,如何做到缓存与 db 里的数据一致性
您: 种writer-reader架构般思路缓存更新阶段由writer解决致性问题数据库数据变化同步更新redis并确保缓存更新功 作完整性判断检查全部属性数据使用自增版本号(或间戳)判断否新 作置检测优化降低扫描代价针近间周期内(依0min)数据库更新数据集合应该比较redis进行检查代价比较
⑩ 格式成NTFS时,写入缓存策略要不要画勾
默认都是打勾的。
缓存起的就是这个作用啊,打开缓存机制,性能肯定更高,但是缓存中的数据如果没有及时写回文件,就可能导致数据丢失。
家里供电稳定的话,每次拔出优盘前都采用安全卸载的方式,还是建议打开缓存,性能更好。