Page Cache(I)ehcache

Page Cache(I)ehcache

1. Theory
user -----> page -----> filter ----> action ----> service ----> dao -------> database

2. Configuration changes
timeToIdleSeconds no requests for a time, ehcache will delete the cache data.
timeToLiveSeconds cache live time from the creatation time

<cache name="SimplePageCachingFilter"
maxElementsInMemory="10"
maxElementsOnDisk="10"
eternal="false"
overflowToDisk="true"
diskSpoolBufferSizeMB="20"
timeToIdleSeconds="900"
timeToLiveSeconds="900"
memoryStoreEvictionPolicy="LFU"
/>
LFU will erase the data by the hits of the requests.

<filter>
<filter-name>IndexCacheFilter</filter-name>
<filter-class>
net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter
</filter-class>
<init-param>
<param-name>cacheName</param-name>
<param-value>SimplePageCachingFilter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>IndexCacheFilter</filter-name>
<url-pattern>/index.do</url-pattern>
</filter-mapping>

cache policy
FIFO first in first out
LFU less frequently used
LRU least recently used

3. Problems and Solutions
But get error messages:
2011-07-07 22:44:04,716 ERROR [net.xxxx.app.utils.Utility] (Timer-2) Exception while evicting elements
java.lang.NullPointerException
at net.xxxx.app.utils.Utility.evictExpiredElements(Utility.java:2241)
at org.jboss.scheduler30ss.EhCacheEvictScheduler.perform(EhCacheEvictScheduler.java:37)
at org.jboss.varia.scheduler.Scheduler$Listener.handleNotification(Scheduler.java:1251)
at sun.reflect.GeneratedMethodAccessor207.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.jboss.mx.notification.NotificationListenerProxy.invoke(NotificationListenerProxy.java:153)
at $Proxy316.handleNotification(Unknown Source)
at javax.management.NotificationBroadcasterSupport.handleNotification(NotificationBroadcasterSupport.java:274)
at javax.management.NotificationBroadcasterSupport$SendNotifJob.run(NotificationBroadcasterSupport.java:339)
at javax.management.NotificationBroadcasterSupport$1.execute(NotificationBroadcasterSupport.java:324)
at javax.management.NotificationBroadcasterSupport.sendNotification(NotificationBroadcasterSupport.java:247)
at javax.management.timer.Timer.sendNotification(Timer.java:1247)
at javax.management.timer.Timer.notifyAlarmClock(Timer.java:1209)
at javax.management.timer.TimerAlarmClock.run(Timer.java:1298)
at java.util.TimerThread.mainLoop(Timer.java:534)
at java.util.TimerThread.run(Timer.java:484)

Caused by: net.sf.ehcache.CacheException: Error configuring from /home/luohua/tools/jboss/30ss/ehcache.xml.
Initial cause was Error configuring from input stream. Initial cause was null:509:
Element <cache> does not allow attribute "momoryStoreEvictionPolicy".

Solution:
This is my project problem. My project already use ehcache in the system.
It will create the CacheManager from a configuration file this way:
cm = CacheManager.create(configuration_file_directory + "/ehcache.xml");

That is the problem. So I will customized the filter class like this CustomerSimplePageCachingFilter.java:
package com.xxxxx.web.filter;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter;
import net.xxx.xxxx.utils.Utility;

public class CustomerSimplePageCachingFilter extends SimplePageCachingFilter {

protected CacheManager getCacheManager() {
return Utility.getCacheManager();
}
}

Performance Test
>ab -n 1000 -c 50 http://localhost:8080/project/index.do >> log1.txt
>ab -n 1000 -c 50 http://localhost:8080/project/index.do >> log2.txt

error message:
apr_poll: The timeout specified has expired (70007)

solution:
This a bug from ab maybe, I just change the -n to a small number.

The comparation of the test results log1.txt:
Concurrency Level: 50
Time taken for tests: 84.977 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 3444000 bytes
HTML transferred: 3055000 bytes
Requests per second: 11.77 [#/sec] (mean)
Time per request: 4248.845 [ms] (mean)
Time per request: 84.977 [ms] (mean, across all concurrent requests)
Transfer rate: 39.58 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.3 0 8
Processing: 2179 4201 704.5 4095 8009
Waiting: 2178 4201 704.5 4095 8009
Total: 2181 4201 704.5 4095 8009

Percentage of the requests served within a certain time (ms)
50% 4095
66% 4286
75% 4425
80% 4531
90% 4960
95% 5591
98% 6454
99% 6950
100% 8009 (longest request)

log2.txt:
Concurrency Level: 50
Time taken for tests: 0.709 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 3218000 bytes
HTML transferred: 2975000 bytes
Requests per second: 1410.30 [#/sec] (mean)
Time per request: 35.453 [ms] (mean)
Time per request: 0.709 [ms] (mean, across all concurrent requests)
Transfer rate: 4431.98 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.6 0 3
Processing: 1 34 22.3 30 181
Waiting: 1 34 22.2 30 165
Total: 2 34 22.7 30 184

Percentage of the requests served within a certain time (ms)
50% 30
66% 37
75% 41
80% 43
90% 56
95% 75
98% 87
99% 159
100% 184 (longest request)

references:
http://ahuaxuan.iteye.com/blog/128458
http://wiki.springside.org.cn/display/calvin/Ehcache
http://hi.baidu.com/luohuazju/blog/item/b9ac3e51803fe7858d543026.html
http://ehcache.org/documentation/samples.html#Cache_Server_Examples
内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
购物车是一个经典的缓存场景,可以使用 Ehcache 实现。以下是一个简单的购物车实现: 1. 首先,定义一个 CartItem 类,表示购物车中的商品项,包含商品 ID、商品名称、商品数量、商品单价等信息。 ```java public class CartItem { private Long itemId; private String itemName; private Integer quantity; private BigDecimal price; // 省略 getter 和 setter 方法 } ``` 2. 定义一个 Cart 类,表示购物车。在 Cart 类中,使用 Ehcache 缓存购物车中的商品项,以便在多个请求之间共享购物车信息。 ```java public class Cart { private CacheManager cacheManager; private Cache<Long, CartItem> cartCache; public Cart() { cacheManager = CacheManagerBuilder.newCacheManagerBuilder().build(); cacheManager.init(); cartCache = cacheManager.createCache("cartCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, CartItem.class, ResourcePoolsBuilder.heap(100))); } public void addItem(CartItem item) { Long itemId = item.getItemId(); CartItem existingItem = cartCache.get(itemId); if (existingItem != null) { existingItem.setQuantity(existingItem.getQuantity() + item.getQuantity()); } else { cartCache.put(itemId, item); } } public void removeItem(Long itemId) { cartCache.remove(itemId); } public List<CartItem> getItems() { return new ArrayList<>(cartCache.values()); } public void clear() { cartCache.clear(); } public void close() { cacheManager.close(); } } ``` 在 Cart 类中,使用 Ehcache 缓存管理器创建一个名为 "cartCache" 的缓存,缓存的键为商品 ID,值为 CartItem 对象。addItem() 方法向购物车中添加商品项,如果商品项已存在,则增加商品数量;否则,将商品项添加到购物车中。removeItem() 方法从购物车中删除指定商品项。getItems() 方法返回购物车中的所有商品项。clear() 方法清空购物车。close() 方法关闭 Ehcache 缓存管理器。 3. 在 Web 应用程序中使用购物车。在 Web 应用程序中,通常将购物车保存在 HttpSession 中,以便在多个请求之间共享购物车信息。以下是一个简单的 Servlet 示例代码: ```java public class ShoppingCartServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String itemIdStr = request.getParameter("itemId"); String itemName = request.getParameter("itemName"); String quantityStr = request.getParameter("quantity"); String priceStr = request.getParameter("price"); Long itemId = Long.parseLong(itemIdStr); Integer quantity = Integer.parseInt(quantityStr); BigDecimal price = new BigDecimal(priceStr); CartItem item = new CartItem(itemId, itemName, quantity, price); HttpSession session = request.getSession(true); Cart cart = (Cart) session.getAttribute("cart"); if (cart == null) { cart = new Cart(); session.setAttribute("cart", cart); } cart.addItem(item); response.sendRedirect("cart.jsp"); } } ``` 在这个示例中,从请求参数中获取商品 ID、商品名称、商品数量和商品单价,创建一个 CartItem 对象。然后,获取 HttpSession 对象,从中获取购物车对象。如果购物车对象不存在,则创建一个新的购物车对象,并将其保存到 HttpSession 中。然后,将商品项添加到购物车中,并重定向到购物车页面。 在购物车页面(cart.jsp)中,可以通过调用 Cart 类的 getItems() 方法获取购物车中的所有商品项,并显示在页面上。 ```jsp <%@ page contentType="text/html;charset=UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>购物车</title> </head> <body> <table> <tr> <th>商品ID</th> <th>商品名称</th> <th>商品数量</th> <th>商品单价</th> <th>小计</th> </tr> <c:forEach var="item" items="${cart.items}"> <tr> <td>${item.itemId}</td> <td>${item.itemName}</td> <td>${item.quantity}</td> <td>${item.price}</td> <td>${item.quantity * item.price}</td> </tr> </c:forEach> </table> </body> </html> ``` 这个示例代码演示了如何使用 Ehcache 实现购物车功能。在实际应用中,购物车的功能可能更加复杂,例如支持优惠券、促销活动等。但是,使用 Ehcache 缓存购物车信息是一个常见的做法,可以提高应用程序的性能和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值