在看hibernate的官方文档时,看到关于缓存的介绍。

hibernate在缓存管理上做的很好,具体使用,本章不做讲解,本篇主要研究EhCache的用法。其中hibernate使用到的缓存提供商列表如下:

Cache Provider class Type Cluster Safe Query Cache Supported
Hashtable (not intended for production use) org.hibernate.cache.HashtableCacheProvider memory yes
EHCache org.hibernate.cache.EhCacheProvider memory, disk, transactional, clustered yes yes
OSCache org.hibernate.cache.OSCacheProvider memory,disk yes
SwarmCache org.hibernate.cache.SwarmCacheProvider clustered (ip multicast) yes (clustered invalidation)
JBoss Cache 1.x org.hibernate.cache.TreeCacheProvider clustered (ip multicast), transactional yes (replication) yes (clock sync req.)
JBoss Cache 2 org.hibernate.cache.jbc.JBossCacheRegionFactory clustered (ip multicast), transactional yes (replication or invalidation) yes (clock sync req.)

其中,我对EHCache比较感兴趣。看它支持的类型包括对内存,硬盘,传统,集群都支持。

我们可以单独研究一下Ehcache缓存的使用,这样方便以后我们对其他使用到缓存的地方进行缓存的自定义管理(不单单在hibernate查询数据方面)。

ehcache下载地址:   http://sourceforge.net/projects/ehcache/files/ehcache/

先写个例子,看看它的api如何使用:

EhcacheTest

[html] view plaincopy
  1. package org.base.cache.test;
  2. import java.net.MalformedURLException;
  3. import java.net.URL;
  4. import net.sf.ehcache.Cache;
  5. import net.sf.ehcache.CacheManager;
  6. import net.sf.ehcache.Element;
  7. import net.sf.ehcache.config.CacheConfiguration;
  8. import net.sf.ehcache.config.Configuration;
  9. /**
  10. * Ehcache缓存管理的api测试小例子
  11. * @author blossom
  12. *
  13. */
  14. public class EhcacheTest {
  15. /**
  16. * @param args
  17. */
  18. public static void main(String[] args) throws MalformedURLException {
  19. net.sf.ehcache.config.Configuration config=new Configuration();
  20. //如果不使用ehcache.xml配置文件,那么必须用代码配置一个defaultCacheConfiguration
  21. CacheConfiguration defaultCacheConfiguration=new CacheConfiguration();
  22. defaultCacheConfiguration.setMaxEntriesLocalHeap(0);
  23. defaultCacheConfiguration.setEternal(false);
  24. defaultCacheConfiguration.setTimeToIdleSeconds(30);
  25. defaultCacheConfiguration.setTimeToLiveSeconds(30);
  26. config.addDefaultCache(defaultCacheConfiguration);//设置默认cache
  27. net.sf.ehcache.CacheManager cacheManager=CacheManager.create(config);
  28. //创建缓存信息
  29. /*构造方法有多种,详见文档
  30. public Cache(String name,
  31. int maxElementsInMemory,
  32. boolean overflowToDisk,
  33. boolean eternal,
  34. long timeToLiveSeconds,
  35. long timeToIdleSeconds)
  36. */
  37. //自定义配置缓存
  38. net.sf.ehcache.Cache cache1=new Cache("mycache-one", 1000, false, false, 30, 30);
  39. cacheManager.addCache(cache1);
  40. //只有配置了defaultCacheConfiguration,这个方法才可以使用。因为用字符串命名的缓存必须有实际配置。
  41. cacheManager.addCache("mycache-two");//添加一个空缓存
  42. //往缓存中放值
  43. String objkey1="key1",objvalue1="value1";
  44. cache1.put(new Element(objkey1,objvalue1));//直接放
  45. //遍历取出某个缓存中的所有值
  46. if(cacheManager.getCache("mycache-one")!=null){
  47. Cache cache11=cacheManager.getCache("mycache-one");
  48. if(cache11.getKeys().size()==0){
  49. System.out.println("mycache-one exits,but no value.");
  50. }else{
  51. for(int i=0;i<cache11.getKeys().size();i++){
  52. Object thekey=cache11.getKeys().get(i);
  53. Object thevalue=cache11.get(thekey);
  54. System.out.println("mycache-one-"+i+",key:"+thekey.toString()+",value:"+thevalue.toString());
  55. }
  56. }
  57. }else{
  58. System.out.println("mycache-one-is null");
  59. }
  60. /*打印
  61. mycache-one-0,key:key1,value:[ key = key1, value=value1, version=1, hitCount=1, CreationTime = 1366263629054, LastAccessTime = 1366263629054 ]
  62. */
  63. if(cacheManager.getCache("mycache-two")!=null){
  64. Cache cache2=cacheManager.getCache("mycache-two");
  65. if(cache2.getKeys().size()==0){
  66. System.out.println("mycache-two exits,but no value.");
  67. }else{
  68. for(int i=0;i<cache2.getKeys().size();i++){
  69. Object thekey=cache2.getKeys().get(i);
  70. Object thevalue=cache2.get(thekey);
  71. System.out.println("mycache-two-"+i+",key:"+thekey.toString()+",value:"+thevalue.toString());
  72. }
  73. }
  74. }else{
  75. System.out.println("mycache-two-is null");
  76. }
  77. /*打印
  78. mycache-two exits,but no value.
  79. */
  80. }
  81. }

Ehcache在使用的大多数情况,是用ehcache.xml来配置的。在spring中的集成很方便。

下面我们使用ehcache.xml,但不在web环境下,对缓存进行自定义。

org/base/cache/test/myehcache.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="ehcache.xsd"
  4. updateCheck="true" monitoring="autodetect"
  5. dynamicConfig="true">
  6. <diskStore path="java.io.tmpdir"/>
  7. <!-- JTA事务配置。class属性若为空,则默认会按照一个顺序寻找TransactionManager对象。
  8. 也可以自定义,需要实现接口net.sf.ehcache.transaction.manager.TransactionManagerLookup
  9. -->
  10. <!--
  11. <transactionManagerLookup class="net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup"
  12. properties="jndiName=java:/TransactionManager" propertySeparator=";"/>
  13. -->
  14. <!-- CacheManagerEventListener  缓存监听,根据需要自定义监听类
  15. <cacheManagerEventListenerFactory class="" properties=""/>
  16. -->
  17. <!-- Terracotta服务器集群配置,详细看文档 -->
  18. <!--
  19. <terracottaConfig url="localhost:9510"/>
  20. -->
  21. <defaultCache
  22. maxEntriesLocalHeap="0"
  23. eternal="false"
  24. timeToIdleSeconds="30"
  25. timeToLiveSeconds="30">
  26. <!-- <terracotta/>-->
  27. </defaultCache>
  28. <!--
  29. 缓存名为myCache1,
  30. 这个缓存最多包含10000个元素在内存中,并将
  31. 闲置超过5分钟和存在超过10分钟的元素释放。
  32. 如果超过10000元素,将溢流到磁盘缓存,并且硬盘缓存最大数量是1000.
  33. 硬盘路径是定义的java.io.tmp。
  34. -->
  35. <cache name="myCache1"
  36. maxEntriesLocalHeap="500"
  37. maxEntriesLocalDisk="1000"
  38. eternal="false"
  39. diskSpoolBufferSizeMB="20"
  40. timeToIdleSeconds="300"
  41. timeToLiveSeconds="600"
  42. memoryStoreEvictionPolicy="LFU"
  43. transactionalMode="off">
  44. <persistence strategy="localTempSwap"/>
  45. </cache>
  46. <!--
  47. 缓存名为sampleCache2。
  48. 此缓存在内存中最大元素的数量是1000。
  49. 没有设置溢出到磁盘,所以1000就是这个缓存的最大值。
  50. 注意,当一个缓存eternal设置成true,那么TimeToLive
  51. 和timeToIdle江不起作用。
  52. <cache name="sampleCache2"
  53. maxEntriesLocalHeap="1000"
  54. eternal="true"
  55. memoryStoreEvictionPolicy="FIFO"/>
  56. -->
  57. <!--
  58. 缓存名为sampleCache3的。
  59. 这个缓存溢出会到磁盘。磁盘缓存存储在虚拟机重新启动前会持久有效。
  60. 磁盘的终止线程的时间间隔设置为3分钟,覆盖默认的2分钟。
  61. <cache name="sampleCache3"
  62. maxEntriesLocalHeap="500"
  63. eternal="false"
  64. overflowToDisk="true"
  65. diskPersistent="true"
  66. timeToIdleSeconds="300"
  67. timeToLiveSeconds="600"
  68. diskExpiryThreadIntervalSeconds="180"
  69. memoryStoreEvictionPolicy="LFU">
  70. </cache>
  71. -->
  72. <!--
  73. Terracotta集群缓存sampleTerracottaCache。
  74. <cache name="sampleTerracottaCache"
  75. maxBytesLocalHeap="10m"
  76. eternal="false"
  77. timeToIdleSeconds="3600"
  78. timeToLiveSeconds="1800">
  79. <terracotta/>
  80. </cache>
  81. -->
  82. </ehcache>

关于配置的属性的含义,可以到官网的文档中查看,这里给出一些常用的属性。

[html] view plaincopy
  1. Cache的以下属性是必须的。
  2. name:
  3. cache的唯一标识。
  4. maxEntriesLocalHeap:
  5. 在内存创建对象的最大数量。0=无限制。
  6. 无限制实际指Integer.MAX_SIZE (2147483647)。
  7. maxEntriesLocalDisk:
  8. 设置在硬盘上存储的对象的最大数量。默认0,即无限制。
  9. eternal:
  10. 设置元素是否持久化。如果是,元素不会过期。
  11. Cache的以下属性是可选的。
  12. overflowToOffHeap:
  13. 此功能仅在企业版的Ehcache。
  14. 当设置为true,可利用无限制的离堆内存的缓存
  15. 存储,以提高性能。离堆内存是不受Java
  16. GC限制的。默认值是false。
  17. maxBytesLocalHeap:
  18. 定义多少字节缓存可能会使用虚拟机的堆。如果一个CacheManager的
  19. maxBytesLocalHeap已经被定义,这个缓存的指定金额将
  20. 减去从CacheManager的。其他的高速缓存将分享剩下的人。
  21. 此属性的值是<数字> K | K |米| M| G| G
  22. 千字节(K| K),兆字节(M| M)或千兆字节(G| G)。
  23. 例如,maxBytesLocalHeap的“2G”下发2 GB的堆内存。
  24. 如果您指定一个maxBytesLocalHeap,就不能再使用属性maxEntriesLocalHeap。
  25. maxBytesLocalOffHeap:
  26. 此功能仅在企业版的Ehcache。
  27. 离堆内存量,可以使用这个缓存设置,将保留。
  28. 此设置将设置overflowToOffHeap为true 。设置explicitly为false来禁用溢出行为。
  29. 需要注意的是使用时离堆,设置maxEntriesLocalHeap建议至少100个元素,
  30. 否则性能会出现严重退化,并提出警告。
  31. 可分配的最低金额为128MB。没有最大值。
  32. maxBytesLocalDisk:
  33. As for maxBytesLocalHeap, but specifies the limit of disk storage this cache will ever use.
  34. timeToIdleSeconds:
  35. 设置元素闲置时长。单位:秒。(在eternal设置成false的情况下有效)
  36. 可选属性。值为0意味着元素可以闲置无穷。
  37. 默认值是0。
  38. timeToLiveSeconds:
  39. 设置元素过期时长。单位:秒。(在eternal设置成false的情况下有效)
  40. 可选属性。值为0意味着,元素可以住无穷。
  41. 默认值是0。
  42. diskExpiryThreadIntervalSeconds:
  43. 磁盘到期线程运行之间的秒数。默认值为120秒。
  44. diskSpoolBufferSizeMB:
  45. 这是分配硬盘存储的缓冲区的大小。信息被写入
  46. 这个区域,然后异步写入到磁盘中。默认大小为30MB。
  47. 每个缓冲区仅用于由其缓存。如果你遇到内存溢出错误试着
  48. 降低此值。为了提高硬盘存储性能应考虑增加此值。
  49. clearOnFlush:
  50. 调用flush()方法时,硬盘存储缓存被清除。
  51. 默认值是true。
  52. memoryStoreEvictionPolicy:
  53. 内存管理策略,默认是最近最少使用策略(即Least Recently Used,LRU)。
  54. 其他可选的有先进先出策略(即 First In First Out,FIFO),最少使用频率策略
  55. (即Less Frequently Used,LFU)。
  56. copyOnRead:
  57. 一个元素被复制时是否从缓存中读取。
  58. 默认false。
  59. copyOnWrite:
  60. 一个元素被添加到缓存中时是否被复制。
  61. 默认false。

EhcacheManagerTest

[html] view plaincopy
  1. package org.base.cache.test;
  2. import java.net.URL;
  3. import net.sf.ehcache.Cache;
  4. import net.sf.ehcache.CacheManager;
  5. import net.sf.ehcache.Element;
  6. import net.sf.ehcache.Status;
  7. /**
  8. * Ehcache缓存管理的初步学习实例
  9. * @author blossom
  10. *
  11. */
  12. public class EhcacheManagerTest {
  13. public static net.sf.ehcache.CacheManager cacheManager = null;
  14. private static String configPath="org/base/cache/test/myehcache.xml";//配置文件路径,一般会放在源文件夹
  15. private static String CACHE_MYCACHE1="myCache1";//定义文件中配置的缓存
  16. //实例化cacheManager,单例模式
  17. public static CacheManager getCacheManagerInstance(){
  18. if (cacheManager == null) {
  19. URL configUrl=null;
  20. configUrl = EhcacheManagerTest.class.getClassLoader().getResource(configPath);
  21. cacheManager = CacheManager.create(configUrl);
  22. }
  23. return cacheManager;
  24. }
  25. public static net.sf.ehcache.CacheManager getCacheManager() {
  26. return getCacheManagerInstance();//单例缓存管理
  27. }
  28. //这个set可以不开放
  29. public static void setCacheManager(net.sf.ehcache.CacheManager cacheManager) {
  30. EhcacheManagerTest.cacheManager = cacheManager;
  31. }
  32. //添加新缓存
  33. public static void addCacheByName(String cacheName){
  34. if(cacheName==null||cacheName.trim().equals("")){
  35. System.out.println("cacheName is null");
  36. }else{
  37. if(getCacheManager().getCache(cacheName.trim())!=null){
  38. getCacheManager().removeCache(cacheName.trim());
  39. }
  40. getCacheManager().addCache(cacheName.trim());
  41. System.out.println(cacheName+ "重新添加");
  42. }
  43. }
  44. //得到cache对象
  45. public static Cache getCacheByName(String cacheName){
  46. Cache cache=null;
  47. if(cacheName==null||cacheName.trim().equals("")){
  48. System.out.println("cacheName is null");
  49. }else{
  50. if(getCacheManager().getCache(cacheName.trim())!=null){
  51. cache=getCacheManager().getCache(cacheName.trim());
  52. }
  53. }
  54. return cache;
  55. }
  56. //往缓存中添加元素
  57. public static void putElementToCache(String cacheName,String elementKey,Object elementValue){
  58. Cache cache=null;
  59. if(cacheName==null||cacheName.trim().equals("")){
  60. System.out.println("添加缓存元素失败,cacheName is null");
  61. }else if(elementKey==null||elementValue==null){
  62. System.out.println("添加缓存元素失败,elementKey or elementValue is null");
  63. }else{
  64. if(getCacheByName(cacheName.trim())!=null){//缓存存在
  65. cache=getCacheByName(cacheName.trim());
  66. }else{//缓存不存在
  67. addCacheByName(cacheName.trim());
  68. cache=getCacheByName(cacheName.trim());
  69. }
  70. //对cache对象添加Element
  71. Element element=null;
  72. if(cache.get(elementKey.trim())!=null){
  73. cache.remove(elementKey.trim());
  74. }
  75. element=new Element(elementKey.trim(),elementValue);
  76. cache.put(element);
  77. System.out.println("添加缓存元素:"+elementKey+"成功!");
  78. }
  79. }
  80. //从缓存中获取指定key的值
  81. public static Object getElementValueFromCache(String cacheName,String elementKey){
  82. Object result=null;
  83. Cache cache=null;
  84. if(cacheName==null||cacheName.trim().equals("")){
  85. System.out.println("获取缓存元素失败,cacheName is null");
  86. }else if(elementKey==null){
  87. System.out.println("获取缓存元素失败,elementKey  is null");
  88. }else{
  89. if(getCacheByName(cacheName.trim())!=null){//缓存存在
  90. cache=getCacheByName(cacheName.trim());
  91. Element element=null;
  92. if(cache.get(elementKey.trim())!=null){
  93. element=cache.get(elementKey.trim());
  94. if(element.getObjectValue()==null){
  95. System.out.println("缓存中"+elementKey+" 的值为空.");
  96. }else{
  97. result=element.getObjectValue();
  98. }
  99. }else{
  100. System.out.println("缓存中"+elementKey+" 的Element值为空.");
  101. }
  102. }else{//缓存不存在
  103. System.out.println("获取缓存元素失败,缓存"+cacheName+" 为空.");
  104. }
  105. }
  106. return result;
  107. }
  108. /**
  109. * 把所有cache中的内容删除,但是cache对象还是保留.
  110. * Clears the contents of all caches in the CacheManager,
  111. *  but without removing any caches.
  112. */
  113. public static void clearAllFromCacheManager(){
  114. if(getCacheManager()!=null){
  115. getCacheManager().clearAll();
  116. System.out.println("CacheManager was clearAll...");
  117. }
  118. }
  119. /**
  120. * 把所有cache对象都删除。慎用!
  121. * Removes all caches using removeCache(String) for each cache.
  122. */
  123. public static void removalAllFromCacheManager(){
  124. if(getCacheManager()!=null){
  125. getCacheManager().removalAll();
  126. System.out.println("CacheManager was removalAll...");
  127. }
  128. }
  129. //不用缓存时,要关闭,不然会占用cpu和内存资源。
  130. public static void shutdownCacheManager(){
  131. if(getCacheManager()!=null){
  132. getCacheManager().shutdown();
  133. System.out.println("CacheManager was shutdown...");
  134. }
  135. }
  136. //打印方法1,为了测试用
  137. public static void printCache(Cache cache){
  138. System.out.println("缓存状态: "+cache.getStatus().toString());
  139. if(cache==null){
  140. System.out.println("cache is null,no print info.");
  141. }else if(cache.getStatus().toString().equals(Status.STATUS_UNINITIALISED)){
  142. System.out.println("缓存状态: 未初始化"+cache.getStatus().toString());
  143. }else if(cache.getStatus().toString().equals(Status.STATUS_SHUTDOWN)){
  144. System.out.println("缓存状态: 已关闭"+cache.getStatus().toString());
  145. }else if(cache.getStatus().toString().equals(Status.STATUS_ALIVE)){
  146. if(cache.getKeys().size()==0){
  147. System.out.println(cache.getName()+" exits,but no value.");
  148. }else{
  149. for(int i=0;i<cache.getKeys().size();i++){
  150. Object thekey=cache.getKeys().get(i);
  151. Object thevalue=cache.get(thekey);
  152. System.out.println(cache.getName()+"--"+i+",key:"+thekey.toString()+",value:"+thevalue.toString());
  153. }
  154. }
  155. }
  156. }
  157. //打印方法2,为了测试用
  158. public static void printCacheByName(String cacheName){
  159. if(cacheName==null||cacheName.trim().equals("")){
  160. System.out.println("cacheName is null,no print info.");
  161. }else{
  162. if(getCacheManager().getCache(cacheName.trim())!=null){
  163. Cache cache=getCacheManager().getCache(cacheName.trim());
  164. printCache(cache);
  165. }else{
  166. System.out.println(cacheName+" --null");
  167. }
  168. }
  169. }
  170. public static void main(String[] sdfsf){
  171. Cache cache1=EhcacheManagerTest.getCacheByName(EhcacheManagerTest.CACHE_MYCACHE1);
  172. printCache(cache1);
  173. EhcacheManagerTest.putElementToCache(EhcacheManagerTest.CACHE_MYCACHE1, "111", "111haah");
  174. EhcacheManagerTest.putElementToCache(EhcacheManagerTest.CACHE_MYCACHE1, "222", "222haah");
  175. EhcacheManagerTest.putElementToCache(EhcacheManagerTest.CACHE_MYCACHE1, "333", "333haah");
  176. printCache(cache1);
  177. EhcacheManagerTest.putElementToCache(EhcacheManagerTest.CACHE_MYCACHE1, "111", "111的新值。");
  178. System.out.println(EhcacheManagerTest.getElementValueFromCache(EhcacheManagerTest.CACHE_MYCACHE1, "111"));
  179. printCache(cache1);
  180. clearAllFromCacheManager();
  181. printCache(cache1);
  182. removalAllFromCacheManager();
  183. printCache(cache1);
  184. shutdownCacheManager();
  185. }
  186. /*打印
  187. 缓存状态: STATUS_ALIVE
  188. 添加缓存元素:111成功!
  189. 添加缓存元素:222成功!
  190. 添加缓存元素:333成功!
  191. 缓存状态: STATUS_ALIVE
  192. 添加缓存元素:111成功!
  193. 111的新值。
  194. 缓存状态: STATUS_ALIVE
  195. CacheManager was clearAll...
  196. 缓存状态: STATUS_ALIVE
  197. CacheManager was removalAll...
  198. 缓存状态: STATUS_SHUTDOWN
  199. CacheManager was shutdown...
  200. */
  201. }

通过上面的使用,我们初步了解Ehcache的api。在web环境下,我们可以注入EhcacheManager对象,

把需要的数据,放入缓存。在其他地方取数据的时候,就从过EhcacheManager来获取,而不是直接

从数据库查询。这样就提高了效率。

值得注意的是,缓存的使用一般在一些数据比较固定的地方。如果某个查询需要保证数据的实时性,使用缓存

就是错误的做法。

EhCache缓存学习相关推荐

  1. Spring Boot 2.x基础教程:使用EhCache缓存集群

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 上一篇我们介绍了在Spring Boot中整合EhCac ...

  2. SpringBoot集成Cache缓存(Ehcache缓存框架,注解方式)

    1.说明 Spring定义了CacheManager和Cache接口, 用来统一不同的缓存技术, 例如JCache,EhCache,Hazelcast,Guava,Redis等. 本文通过Spring ...

  3. mybatis配置ehcache缓存

    1:在spring配置文件中加载缓存配置文件 <!-- 使用ehcache缓存 --> <bean id="ehCacheManager" class=" ...

  4. Ehcache 缓存监控配置

    监控 ehcache缓存: 1,下载: http://terracotta.org/downloads/open-source/destination?name=ehcache-monitor-kit ...

  5. Ehcache 缓存

    1 package org.jeecgframework.core.util; 2 3 import net.sf.ehcache.Cache; 4 import net.sf.ehcache.Cac ...

  6. shiro教程:整合ehcache缓存

    这个是在ssm的基础上再去整合shiro和ehcache的,整合ehcache主要是为了减少后台shiro拦截的次数,因为如果我们不使用缓存的话,后台shiro的认证和授权的拦截器就会反复的进行拦截, ...

  7. javaweb项目搭建ehcache缓存系统

    转载自  javaweb项目搭建ehcache缓存系统 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider,同时在项目开发中 ...

  8. [原创]mybatis中整合ehcache缓存框架的使用

    mybatis整合ehcache缓存框架的使用 mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓 ...

  9. 一文玩转 EhCache 缓存框架!

    Ehcache 介绍 EhCache 从 Hibernate 发展而来,是一个纯Java的进程内缓存框架,具有快速.精干等特点.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存, ...

最新文章

  1. isolate-user-vlan隔离用户vlan的配置
  2. python之内置函数(二)与匿名函数、递归函数初识
  3. 学python可以做什么产品-学习Python到底有什么用?
  4. pygtk在windows的安装
  5. linux跳转乌班图服务器,Ubuntu18.04连接Linux服务器与文件传输
  6. 【Eclipse使用教程】Java导包快捷键
  7. 卡内基梅隆大学计算机专业有哪些,卡内基梅隆大学计算机系统类大学排名最新资讯总结篇...
  8. 人员-组织 结构 数据库关系设计
  9. CTS、CLS和CLR
  10. 自动化测试 (二) 连连看外挂
  11. HR_NZ_ROUNDING_DECIMALS DUMP
  12. R语言分析股票指数的GARCH效应
  13. 高级架构师_Elasticsearch_第二章kibana+IK分词器安装+索引操作+ 映射操作
  14. java获取ip地址与网络接口
  15. 电脑开机时网络连接一直转圈,出现红叉
  16. Android手机蓝牙连接笔记本电脑蓝牙
  17. BMW Standard Tools 宝马FSC工具套装下载
  18. 阿里云服务器ECS开放8080端口
  19. 数据结构之顺序表的删除、查找、遍历
  20. sql语句的批量添加

热门文章

  1. linux rc.local权限,Linux开机启动rc.local不执行分析
  2. OpenShift 4 之Istio-Tutorial (6) 服务恢复能力(重试、超时、断路器)
  3. 初步创建vue/cli工程教程
  4. 金蝶kis仓库管理系统演示_金蝶KIS专业版生产管理的系统亮点功能
  5. linux裸设备大小,SUSE Linux 十 配置裸设备(raw devices)
  6. java 内存指针_java内存模型详解
  7. 高级会计可以用计算机,高会无纸化考试计算器不好用 建excel计算可以吗?官方回复!...
  8. java中的四个跳转语句_Java中的流程控制语句 (基础篇四)
  9. python计算两字符串中的位置_从Python中的字符串中获取两个字符
  10. html5播放视频自动循环播放,HTML5 通过Vedio标签实现视频循环播放的示例代码