论坛首页 Java企业应用论坛

还是tomcat集群的东西,实现的memcached共享session(用的国人开发的xmemcached)

浏览 6534 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-30   最后修改:2012-10-30
这个是借鉴MSM项目自己完成的一个tomcat的sessionManager.

功能:解决了tomcat集群session共享的问题,避免使用tomcat session复制.

MSM用的是spymemcached我个人不太喜欢,还是喜欢用国人开发的xmemcached项目,
所以基于这个xmemcached依照msm自己完成了一个简单的tomcat sessionManager
xmemcached下载地址:http://code.google.com/p/xmemcached/

win32的memcached下载(这个版本比较老了,不支持二进制协议)
http://code.jellycan.com/memcached/

我项目中用的是国人自己编译的memcached_1.4.5(支持二进制协议了,但是还不能使用touch)

所有的东西我都放在附件里了,欢迎大家提意见,有兴趣的可以一起研究.
因为我对session超时这块判断好像还有点问题,还在研究tomcat文档和sessionManger源码中.

session共享时需要注意的:memcached保存的对象反序列化时,如果有自定义类的话,需要通过sessionManager获得到具体项目的classloader才能反序列化,否则会出现classNotFound异常,这里困扰了我很久最后搞清楚了!
大家注意看下面的代码
//注意这个:CustomObjectInputStream是tomcat,catalina.jar中的类,目的是可以根据实际的web项目来获得对应的classloader来加载需要反序列化的对象.

private ObjectInputStream createObjectInputStream(ByteArrayInputStream bis)throws IOException {
		Loader loader = null;
		ClassLoader classLoader = null;
		if (this._manager.getContainer() != null) {
			loader = this._manager.getContainer().getLoader();
		}
		if (loader != null) {
			classLoader = loader.getClassLoader();
		}
		ObjectInputStream ois;
		if (classLoader != null) {
			ois = new CustomObjectInputStream(bis,classLoader);
		} else {
			ois = new ObjectInputStream(bis);
		}
		return ois;
	}


目前我这个功能已经在项目中使用了.
   发表时间:2012-10-30  
这个我也用过,如果只是为了集群session同步,Xmemcached根本没必要。
0 请登录后投票
   发表时间:2012-10-30   最后修改:2012-10-30
joe_zhjiang 写道
这个我也用过,如果只是为了集群session同步,Xmemcached根本没必要。

为什么?想听听你的建议,我觉得xmemcached的性能要好很多!

试想一下一个 tomcat集群首先不管 有多少个tomcat

光每次的请求和定时更新session时间的任务就已经要占用很多memcached的连接!

线程的并发是很高的,随着tomcat节点的增加~~~
0 请登录后投票
   发表时间:2012-10-31  
LikeEJB_CC 写道
joe_zhjiang 写道
这个我也用过,如果只是为了集群session同步,Xmemcached根本没必要。

为什么?想听听你的建议,我觉得xmemcached的性能要好很多!

试想一下一个 tomcat集群首先不管 有多少个tomcat

光每次的请求和定时更新session时间的任务就已经要占用很多memcached的连接!

线程的并发是很高的,随着tomcat节点的增加~~~


我认为:实际上连接不会超过tomcat的服务Thread的。感觉用个连接池足够了。
0 请登录后投票
   发表时间:2012-11-01  
用F5 负载均衡 不需要同步session
0 请登录后投票
   发表时间:2012-11-01  
我是没有自己学习过缓存技术,所以不予评价,不过先下载下来,学习下LZ的思路!
0 请登录后投票
   发表时间:2012-11-05  
LikeEJB_CC 写道
joe_zhjiang 写道
这个我也用过,如果只是为了集群session同步,Xmemcached根本没必要。

为什么?想听听你的建议,我觉得xmemcached的性能要好很多!

试想一下一个 tomcat集群首先不管 有多少个tomcat

光每次的请求和定时更新session时间的任务就已经要占用很多memcached的连接!

线程的并发是很高的,随着tomcat节点的增加~~~


xmemcached是用来操作memcached,假如说要实现当用户还在使用时,强制停用用户,则需要xmemcached操作memcached,
在context.xml配置memcached即可以完成session同步,配置如下:

 
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.1.37:11211"
        requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
        sessionBackupAsync="false"
        sessionBackupTimeout="100"
        copyCollectionsForSerialization="false"
        />


0 请登录后投票
   发表时间:2012-11-05  
joe_zhjiang 写道
LikeEJB_CC 写道
joe_zhjiang 写道
这个我也用过,如果只是为了集群session同步,Xmemcached根本没必要。

为什么?想听听你的建议,我觉得xmemcached的性能要好很多!

试想一下一个 tomcat集群首先不管 有多少个tomcat

光每次的请求和定时更新session时间的任务就已经要占用很多memcached的连接!

线程的并发是很高的,随着tomcat节点的增加~~~


xmemcached是用来操作memcached,假如说要实现当用户还在使用时,强制停用用户,则需要xmemcached操作memcached,
在context.xml配置memcached即可以完成session同步,配置如下:

 
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.1.37:11211"
        requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
        sessionBackupAsync="false"
        sessionBackupTimeout="100"
        copyCollectionsForSerialization="false"
        />




你好朋友,你说的这个项目我知道,而且我看过这个项目的部分源码.
MSM这个项目用的是spymemcached的JAVA客户端,我不喜欢!
我自己用xmemcached做了修改,就是参照你说的这个项目来完成的.
0 请登录后投票
论坛首页 Java企业应用版

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