选择虚拟终端服务器的几大理由
2012-11-26 11:24
218 查看
此文章为转自他人博客
定义数据访问接口:
对接口方法进行实现,使用Map模拟数据库的表进行存储数据:
如上,对数据进行增删改的时候清空缓存,查询时使用缓存。其中value为缓存区,allEntries表示清空缓存区中的所有数据。为了稍后验证缓存是否生效,打印出执行的方法签名。
定义领域模型:
接下来编写spring配置文件:
最后编写main方法验证缓存是否生效:
打印接过如下,表示已经生效:
最后,spring支持的缓存机制,是方法级的缓存,而不关注底层是否使用了数据库以及通过什么方式访问的数据库;因此这种缓存不止可以放到DAO层,也可以放置到Service层,甚至可以对各种代码数据进行缓存。
如果应用中同时使用了Hibernate和Ibatis,或者这种方式是一种好的缓存解决方案。
定义数据访问接口:
01 | package org.kevin.cache.dao; |
02 |
03 | import java.util.Collection; |
04 |
05 | import org.kevin.cache.domain.Data; |
06 |
07 | public interface DataDAO { |
08 |
09 | public void add(Data data); |
10 |
11 | public void update(Data data); |
12 |
13 | public Data find(Integer id); |
14 |
15 | public void delete(Integer id); |
16 |
17 | public Collection<Data> getAll(); |
18 | } |
01 | package org.kevin.cache.dao; |
02 |
03 | import java.util.Collection; |
04 | import java.util.HashMap; |
05 | import java.util.Map; |
06 |
07 | import org.kevin.cache.domain.Data; |
08 | import org.springframework.cache.annotation.CacheEvict; |
09 | import org.springframework.cache.annotation.Cacheable; |
10 |
11 | public class DataDAOImpl implements DataDAO { |
12 |
13 | private Map<Integer, Data> dataMap = new HashMap<>(); |
14 |
15 | @Override |
16 | @CacheEvict (value = "data" , allEntries = true ) |
17 | public void add(Data data) { |
18 | System.out.println( "Execute:public void add(Data data)" ); |
19 | dataMap.put(data.getId(), data); |
20 | } |
21 |
22 | @Override |
23 | @CacheEvict (value = "data" , allEntries = true ) |
24 | public void update(Data data) { |
25 | System.out.println( "Execute:public void update(Data data) " ); |
26 | dataMap.put(data.getId(), data); |
27 | } |
28 |
29 | @Override |
30 | @Cacheable (value = "data" ) |
31 | public Data find(Integer id) { |
32 | System.out.println( "Execute:public Data find(Integer id)" ); |
33 | return dataMap.get(id); |
34 | } |
35 |
36 | @Override |
37 | @CacheEvict (value = "data" , allEntries = true ) |
38 | public void delete(Integer id) { |
39 | System.out.println( "Execute:public void delete(Integer id)" ); |
40 | dataMap.remove(id); |
41 | } |
42 |
43 | @Override |
44 | @Cacheable (value = "data" ) |
45 | public Collection<Data> getAll() { |
46 | System.out.println( "Execute:public Collection<Data> getAll()" ); |
47 | return dataMap.values(); |
48 | } |
49 | } |
定义领域模型:
01 | package org.kevin.cache.domain; |
02 |
03 | public class Data { |
04 |
05 | private Integer id; |
06 | private String first; |
07 | private String second; |
08 |
09 | public Data(Integer id, String first, String second) { |
10 | this .id = id; |
11 | this .first = first; |
12 | this .second = second; |
13 | } |
14 |
15 | public String getFirst() { |
16 | return first; |
17 | } |
18 |
19 | public void setFirst(String first) { |
20 | this .first = first; |
21 | } |
22 |
23 | public String getSecond() { |
24 | return second; |
25 | } |
26 |
27 | public void setSecond(String second) { |
28 | this .second = second; |
29 | } |
30 |
31 | public void setId(Integer id) { |
32 | this .id = id; |
33 | } |
34 |
35 | public Integer getId() { |
36 | return id; |
37 | } |
38 | } |
01 | < beans xmlns = "http://www.springframework.org/schema/beans" |
02 | xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:p = "http://www.springframework.org/schema/p" |
03 | xmlns:cache = "http://www.springframework.org/schema/cache" |
04 | xsi:schemaLocation=" |
05 | http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd[/code] |
06 | http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd">[/code] |
07 |
08 | < cache:annotation-driven /> |
09 |
10 | < bean id = "cacheManager" class = "org.springframework.cache.support.SimpleCacheManager" > |
11 | < property name = "caches" > |
12 | < set > |
13 | < bean class = "org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name = "default" /> |
14 | < bean class = "org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name = "data" /> |
15 | </ set > |
16 | </ property > |
17 | </ bean > |
18 |
19 | < bean id = "dataDao" class = "org.kevin.cache.dao.DataDAOImpl" /> |
20 | </ beans > |
01 | package org.kevin.cache; |
02 |
03 | import java.util.Collection; |
04 |
05 | import org.kevin.cache.dao.DataDAO; |
06 | import org.kevin.cache.domain.Data; |
07 | import org.springframework.context.support.ClassPathXmlApplicationContext; |
08 |
09 | public class CacheMain { |
10 |
11 | public static void main(String[] args) { |
12 |
13 | ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( "spring-cache-demo.xml" ); |
14 | DataDAO dataDAO = context.getBean( "dataDao" , DataDAO. class ); |
15 |
16 | dataDAO.add( new Data( 1 , "li" , "wenkai" )); |
17 | Collection<Data> dataCollection = dataDAO.getAll(); |
18 | System.out.println(dataCollection.size()); |
19 |
20 | System.out.println( "=================================" ); |
21 |
22 | dataDAO.add( new Data( 2 , "jack" , "lee" )); |
23 | dataCollection = dataDAO.getAll(); |
24 | System.out.println(dataCollection.size());; |
25 | Data data = dataDAO.find( 1 ); |
26 | System.out.println(data.getFirst()); |
27 | data = dataDAO.find( 2 ); |
28 | System.out.println(data.getFirst()); |
29 | data = dataDAO.find( 2 ); |
30 | System.out.println(data.getFirst());; |
31 |
32 | System.out.println( "====================================" ); |
33 | dataDAO.add( new Data( 3 , "kevin" , "lee" )); |
34 | data = dataDAO.find( 2 ); |
35 | System.out.println(data.getFirst()); |
36 | data = dataDAO.find( 3 ); |
37 | System.out.println(data.getFirst()); |
38 | data = dataDAO.find( 2 ); |
39 | System.out.println(data.getFirst()); |
40 | } |
41 | } |
01 | Execute:public void add(Data data) |
02 | Execute:public Collection< Data > getAll() |
03 | 1 |
04 | ================================= |
05 | Execute:public void add(Data data) |
06 | Execute:public Collection< Data > getAll() |
07 | 2 |
08 | Execute:public Data find(Integer id) |
09 | li |
10 | Execute:public Data find(Integer id) |
11 | jack |
12 | jack |
13 | ==================================== |
14 | Execute:public void add(Data data) |
15 | Execute:public Data find(Integer id) |
16 | jack |
17 | Execute:public Data find(Integer id) |
18 | kevin |
19 | jack |
最后,spring支持的缓存机制,是方法级的缓存,而不关注底层是否使用了数据库以及通过什么方式访问的数据库;因此这种缓存不止可以放到DAO层,也可以放置到Service层,甚至可以对各种代码数据进行缓存。
如果应用中同时使用了Hibernate和Ibatis,或者这种方式是一种好的缓存解决方案。
相关文章推荐
- 如何正确选择虚拟主机服务器租用托管服务商?
- 关于个人网站选择虚拟主机还是VPS服务器的讨论
- 服务器系统 选择Windows和Linux的理由
- 你有什么理由还不选择阿里云服务器呢--从阿里云发布自研商用关系型数据库POLARDB想到的
- 建网站该选择服务器还是虚拟主机
- Ubuntu中如何切换到超级用户(root)及在VMware虚拟机中Linux在虚拟终端之间切换的方法
- Nginx服务器、Nginx虚拟主机、Nginx反向代理
- IT部门选择web1800远程服务管理系统的理由
- 企业开发中选择logback而不是log4j的理由
- 连接远程桌面出现提示:终端服务器超出了最大允许连接数
- Tomcat 服务器虚拟路径的几种配置方式
- MySQL服务器Linux IO调度器算法的选择
- PureFtp+PureAdmin:实现基于虚拟账号的FTP服务器
- 用mac终端连接阿里云服务器出现permission denied
- Linux:在vsftpd服务器中配置虚拟用户账号
- java中图片上传和服务器虚拟目录配置
- ACE笔记(一) 选择ACE的理由
- 设置一台虚拟的FTP服务器
- 终端服务器超出最大允许连接数|修改end a disconnected session设置
- 微信小程序图片选择、上传到服务器、预览(PHP)实现实例