实现方式:
a) 通过MemcachedSessionFilter过滤器拦截cookie,取得的sessionId,通过sessionId构造新的HttpServletRequestWrapper对象,传给后面的应用.
b) 继承重构HttpServletRequestWrapper,HttpSessionWrapper类,覆盖原来和session存取相关的方法呢,都通过SessionService类来实现.
c) SessionService连接memcached服务,以sessionId作为key,存取的对象是一个map.map的内容即为session的内容.
d) 读取数据时,先通过sessionId从memcached服务器上获取整个map对象,再以session的attributeName作为key从map中获取数据对象.写数据的方式与读数据类似,先获取map,然后修改map中的值,然后将整个map保存到memcached服务器上.
改进内容:
(1) 使用xmemcached客户端代替java memcached client.
XMemcached同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。
(2) 对修改和删除session属性时,使用cas方法实现,防止在并发时出现数据覆盖的问题.
public void saveSession(String id, Map session) {
long s1= System.currentTimeMillis();
MemCachedClient mc = this.getMemCachedClient();
mc.replace(id, session);
System.out.print("saveSession");
System.out.println(System.currentTimeMillis() -s1);
}
其中保存进去的session是一个通过get方法从memcached上获取的map对象,将map中的值修改以后,将map对象替换服务器上的对象.如果在多台机器并发的情况下,很可能出现一个线程写进去的数据被其它的覆盖.
改进后的代码:
Memcached是通过cas协议实现原子更新,所谓原子更新就是compare and set,原理类似乐观锁,每次请求存储某个数据同时要附带一个cas值,memcached比对这个cas值与当前存储数据的cas值是否相等,如果相等就让新的数据覆盖老的数据,如果不相等就认为更新失败,这在并发环境下特别有用。
public void saveSession(String id,String key, Object arg1) {
long s1= System.currentTimeMillis();
final String k=key;
final Object o=arg1;
try {
mc.cas(id,0,new CASOperation<Map>(){
//尝试更新5次
public int getMaxTries() {
return 5;
}
public Map getNewValue(long currentCAS, Map map) {
map.put(k, o);
return map;
}});
System.out.print("saveSession");
}
finally{
System.out.println(System.currentTimeMillis() -s1);
}
}
分享到:
相关推荐
每个Session都有自己的输入和输出队列,用于存储待处理的事件和数据。 2. **Filter**:过滤器是Mina实现事件处理的核心机制,它定义了一种管道模型,允许开发者对网络通信过程中的数据进行拦截、修改或处理。 3. *...
- **Session**:表示一个网络连接,存储了关于连接的状态信息,如连接的远程地址、打开和关闭状态等。Session提供了读写数据、管理会话事件以及添加/移除过滤器的方法。 - **ProtocolCodec**:Mina框架提供了解码器...
3. **数据访问层(Data Access Layer)**:主要使用JDBC(Java Database Connectivity)与数据库进行交互,处理数据存储和检索。 ### J2EE分层架构 J2EE采用分层架构,以模块化的方式组织应用,常见的组件包括: 1....
这使得Shiro能够独立于Web容器或EJB会话工作,支持更广泛的应用场景,包括Web应用、Flex应用、远程服务调用等。通过设置`securityManager`的`sessionMode`参数,可以选择适合项目的会话模式。 2. **Realm(领域)**...
这种功能在分布式系统、文件共享或者远程操作等场景中非常常见。下面我们将深入探讨Mina如何实现这样的功能。 1. **Mina基础架构**: Mina采用了事件驱动和非阻塞I/O模型,这是高性能网络应用的基础。它使用了Java...
EntityBean 通常对应数据库中的记录,而 SessionBean 更像是业务逻辑的代理。 8.Java Servlet 的生命周期包括哪几个阶段?Servlet 的生命周期包括初始化(init)、服务(service)、销毁(destroy)三个主要阶段。...
【标题】"dubbo-demo" 是一个基于 Dubbo 和 Zookeeper 的示例项目,它展示了如何在实际开发中使用这两个关键技术。Dubbo 是阿里巴巴开源的一款高性能、轻量级的 Java RPC 框架,而 Zookeeper 是一个分布式协调服务,...
- Cookie用于客户端存储少量数据,Session则是在服务器端维护用户会话信息。 **6. Filter: 过滤器** - 可以在请求到达目标资源之前或响应返回客户端之后执行某些操作,如认证、日志记录等。 **7. 监听器** - 用于...
9. **存储过程**:CallableStatement调用数据库存储过程。 10. **下拉列表组件**:HTML,CSS,JavaScript实现。 11. **请求范围共享**:ServletContext,HttpServletRequest,HttpServletResponse。 12. **文件上传...
它基于Java SE,并在此基础上增加了许多针对大型分布式网络应用的技术和服务支持,例如:容器管理、事务处理、安全性、持久化等。J2EE的核心目标是提供一套完整的解决方案来构建和部署可移植、健壮、可伸缩且安全的...