使用spring的简单缓存

这周我的一个老朋友联系到我,因为在他的应用中有个一内存问题,问题非常简单:每一个登录用户所有的应用表单和部分的键值对增加到user session中去(包含一些图片)。那用来提高访问的速度,避免多次请求数据库和加载数据。

那种方法的问题是,每一个用户在内存中都会有一个数据的拷贝。在这个例子中,同样的数据一遍一遍的被拷贝,经过一段时间,访问量增加的时候,JVM将会耗尽内存,用户只要不点击退出按钮情况就会变得越来越糟。

为了帮助他我写了一个简单的例子,从这篇文章中拓展,演示了在spring环境下的一种方式。这个例子展示的是你怎么使用额外的bean让数据缓存起来同时保持更新的装填。

这篇文章和spring3.1中提供的缓存抽象没有关系。

结构

这个应用非常简单,包含两个controller,writeController用来保存数据库的数据,ReadOnlyController用来加载缓存中的数据。保存数据的Controller需要清空缓存以保证每个用户获取的数据都是最新的。
在read-only Controller和service之间有一个simpleCache缓存,用来保存来自service的数据并且可以被清空然后加载下载访问的数据。
下边的图展示了类之间的关系

加载数据

把程序放入tomcat并开启服务器之后,访问http://localhost:8080/spring-simple-cache/你可以看到,下边的内容。

在控制台你可以看到
Controller: /example
Cache: Reading property test...
Cache: Checking if data is loaded...
Cache: Loading data...
Service: Loading data from database...
Service: Finished loading data.
Cache: Data loaded.
387 ms to process http://localhost:8080/spring-simple-cache/
这是你第一次访问页面,需要加载来自service的数据。在service中我增加了一个延时用来模拟性能问题,因为从内存数据库读取数据和从内存中加载数据一样快。为了达到这个目标,我增加了一个Thread.sleep(200)。如果你再一次加载同一个页面,你应该能看到一个显著的性能提高,页面几乎瞬间被加载,你也可以看到在控制台中不同的输出内容。
Controller: /example
Cache: Reading property test...
Cache: Checking if data is loaded...
Cache: Don't need to reload data.
6 ms to process http://localhost:8080/spring-simple-cache/
现在你看到数据没有从service中加载,缓存中已经存在数据了,数据便是从缓存中获取的。

保存新的数据

当通过WriteController增加新的数据的时候,缓存中的数据需要被清空,要看它是怎么运行的,你可以访问add.do这个action然后填写一个表单,填完之后提交,你会得到一条信息说数据已经被保存,你可以在控制台中看到下边这些东西。
Controller: /save
Cache: Clearing cache data...
Cache: Cache data cleared.
15 ms to process http://localhost:8080/spring-simple-cache/save.do
这表明了保存action是如何执行的和缓存是如何被清理的,如果你试着访问use cache链接,你会在控制台看到数据再一次从service中被加载了。
Controller: /example
Cache: Reading property test...
Cache: Checking if data is loaded...
Cache: Loading data...
Service: Loading data from database...
Service: Finished loading data.
Cache: Data loaded.
206 ms to process http://localhost:8080/spring-simple-cache/example.do。

配置

所有重要的配置都在/WEB-INF/spring-servlet.xml这个文件里。第一件我们需要做的事情是确保spring可以自动装载所有的东西,所以我们需要增加下边这句话:
<!-- Enable configuration using annotations -->
<context:annotation-config />

然后我们需要创建datasourse用来产生和数据库的链接,在内存中使用的是H2数据库
<!-- Data source, memory database with H2 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:example" />
    <property name="username" value="sa" />
    <property name="password" value="sa" />
</bean>

我们需要告诉我们的dispatcher servlet在哪里找到我们的Controller和views,我们需要做以下的配置
<!-- Package to scan for controllers -->
<context:component-scan base-package="com.bearprogrammer.blog.spring.cache" />

...

<!-- View resolver that will load JSP files from the /WEB-INF/jsp folder -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

最后需要配置的是加载实际的bean,simplecache和service的实现
<!-- Cache instance -->
<bean id="cache" class="com.bearprogrammer.blog.spring.cache.SimpleCache" />

<!-- Start the service and call its initialize method -->
<bean id="service" init-method="initialize" class="com.bearprogrammer.blog.spring.cache.ExampleServiceImpl" />

为了初始化数据库,initialize方法在service的实现中被调用。

原文地址:https://visola.github.io/2012/07/22/simple-caching-with-spring/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值