论坛首页 Java企业应用论坛

扩展Tomcat 6.x,使用memcached存放session信息

浏览 102949 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-05-24  

apache 的 mod_ajp等,就是用来将用户请求实现 session sticky的。

0 请登录后投票
   发表时间:2007-05-28  
楼主的代码 createSession 方法是不是写错了?怎么没有把session放到memcached中?
0 请登录后投票
   发表时间:2007-05-29  
codeutil 写道

...
5.运行memcached.exe。
(可以运行memcached.exe -vv , -vv可以在控制台显示日志信息 )
6。启动tomcat,在web应用中setAttribute设置支持序列化的属性值。
7. 然后重起tomcat,在再浏览器里访问,jsp读取相关属性的值(使用getAttribute方法),将发现相应属性值都可以正常读取。

(getAttributeNames没有重写,因此无法遍历方式读取属性,只能通过getAttribute读取)




在tomcat6中试了楼主的方法。确实memcached生效了。
但是
setAttribute之后,重启动tomcat,再去同一个浏览器getAttribute。这样得不到结果。
是因为关闭tomcat时,所有的session被清空了?还是别的原因?


btw: tomcat5.5中是否有相似的方案呢?我简单尝试了一下,出错。
0 请登录后投票
   发表时间:2007-05-31  
codeutil 写道

加入oscache的目的减少对memcached的访问次数。
假设启动了20个tomcat,
假如某个attribute,序列化之后的内容长度为10k,

在30分钟内被读取了100次,修改了两次,
如果只使用memcached的话,需要向memcached读取100次,
产生100*10=1M的网络流量,
而使用了oscache的话,
只需要向memcached读取三次,在属性值发生变化的时候,其它tomcat将会收到2*20次缓存失效的jgroups消息。

这样的开销是远远低于对memcached的不停访问的,也减少了序列化和反序列化的开销。



没有必要再用OSCache了吧,如果用OSCache的JGroups机制实现session同步,Memcached没什么存在意义了。
    public Object getAttribute(String name) {
        Object obj = super.getAttribute(name);
        String key = name + this.getId();
        if (obj != null && !(obj instanceof java.io.Serializable)) {
            //这里是否需要更新一下Memcached的更新时间?否则久了,Memcached会删除过期记录的;但是我看了一下MemCachedClient的API,没有这么一个方法,难道要Hack Memcached?
            return obj;
        }
        
        obj = mc.get(key);
        if(obj!=null)super.setAttribute(name, obj);
//这句是我新加上去的,当本地session没有,则从Memcached服务器上取,并存到本地session里就行了吧,何必用OSCache?
        return obj;
    }

    public void setAttribute(String name, Object value) {
        removeAttribute(name);
        super.setAttribute(name, value);
        if (value != null && value instanceof java.io.Serializable) {
            String key = name + this.getId();
            mc.set(key, value);
        }
    }
0 请登录后投票
   发表时间:2007-06-05  
if (obj != null && !(obj instanceof java.io.Serializable)) {   
        return obj;   
    }   


这一句是不是写错了,应该是这样吧?

if (obj != null && obj instanceof java.io.Serializable) {   
        return obj;   
}   
0 请登录后投票
   发表时间:2007-06-05  
对于楼主说要用OSCache来解决的情况我也碰到了。
0 请登录后投票
   发表时间:2007-06-05  
pupi 写道
codeutil 写道

...
5.运行memcached.exe。
(可以运行memcached.exe -vv , -vv可以在控制台显示日志信息 )
6。启动tomcat,在web应用中setAttribute设置支持序列化的属性值。
7. 然后重起tomcat,在再浏览器里访问,jsp读取相关属性的值(使用getAttribute方法),将发现相应属性值都可以正常读取。

(getAttributeNames没有重写,因此无法遍历方式读取属性,只能通过getAttribute读取)




在tomcat6中试了楼主的方法。确实memcached生效了。
但是
setAttribute之后,重启动tomcat,再去同一个浏览器getAttribute。这样得不到结果。
是因为关闭tomcat时,所有的session被清空了?还是别的原因?


btw: tomcat5.5中是否有相似的方案呢?我简单尝试了一下,出错。


重新用JDK1.5编译一下MemcacheClient,因为下载的版本是1.6编译的,同时把log4j的包也放到lib里,因为MemcacheClient用到了。
0 请登录后投票
   发表时间:2007-09-02  
建议搂主完善一下代码,加入有多个tomcat,每个tomcat的应用是不同的,登陆后需要从一个tonmcat跳转到另一个tomcat,需要session的过期时间同步问题,如果搂主把这个解决了,就是把tomcat的做成了真正的
SNA架构了。肯定会在业界广泛使用的。以上只是 个人建议。
0 请登录后投票
   发表时间:2007-09-06  
把session存放到oracle的内存表,会比memcache慢多少?
0 请登录后投票
   发表时间:2007-09-26  
davexin 写道
建议搂主完善一下代码,加入有多个tomcat,每个tomcat的应用是不同的,登陆后需要从一个tonmcat跳转到另一个tomcat,需要session的过期时间同步问题,如果搂主把这个解决了,就是把tomcat的做成了真正的
SNA架构了。肯定会在业界广泛使用的。以上只是 个人建议。


Session过期问题不存在吧,楼主这里是继承了tomcat的session机制~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics