阅读更多

57顶
0踩

编程语言

原创新闻 Memcached Java客户端2.6.1发布

2011-06-27 09:30 by 见习记者 MengLee 评论(56) 有39804人浏览

Memcached是被广泛使用的分布式缓存技术。不同的语言有不同的Memcached客户端程序,对于Java客户端来说,首推Memcached Java Client(http://github.com/gwhalin/Memcached-Java-Client )。

 

这次,Memcached Java Client推出的2.6.1发布版是基于全新的performance分支,具有如下重大改进:

  1. 较之老版本,在性能上有300%左右的提升;
  2. 兼容老版本,用户无须修改自己的源代码;
  3. 支持多个memcached协议,包括text,udp和binary协议;
  4. 支持SASL认证机制;
  5. 重新实现的连接池,修复了之前的连接数太多所导致的OutOfMemory异常;
  6. 加入了slf4j logger支持,使得开发人员可以方便的记录日志;
  7. 支持自定义的对象序列化方法。

这个分支由Schooner Information Technology贡献,并由Schooner中国团队完成开发,开发者是:

  1. 王新根,new.root@gmail.com;
  2. 李蒙,jowett.lee@gmail.com,IT eye博客地址是:http://menglee.iteye.com

可以从这里下载二进制包:https://github.com/gwhalin/Memcached-Java-Client/downloads

源代码在github上,http://github.com/gwhalin/Memcached-Java-Client ,然后选择performance分支。

 

下面是一些性能测试的数据,包括了当前流行的Memcached Java Client。

其中,schooner指的是这个分支的text protocol, schooner_bin指的是binary protocol。

 





57
0
评论 共 56 条 请登录后发表评论
56 楼 lj1096959784 2014-12-22 14:31
楼主,你好,请问使用memCached时出现以下异常是怎么回事呀
ERROR [2014-12-15 14:26:52,926] com.schooner.MemCached.AscIIClient:-1 - ++++ exception thrown while trying to get object from cache for key: discount_quota79com.bst.discount.entity.DiscountInfoabcBank
ERROR [2014-12-15 14:26:52,928] com.schooner.MemCached.AscIIClient:-1 - null
java.nio.BufferUnderflowException: null
        at java.nio.Buffer.nextGetIndex(Buffer.java:492) ~[na:1.7.0_51]
        at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:249) ~[na:1.7.0_51]
        at com.schooner.MemCached.SockInputStream.read(Unknown Source) ~[Memcached-Java-Client-3.0.2.jar:na]
        at com.schooner.MemCached.AscIIClient.get(Unknown Source) [Memcached-Java-Client-3.0.2.jar:na]
        at com.schooner.MemCached.AscIIClient.get(Unknown Source) [Memcached-Java-Client-3.0.2.jar:naat com.schooner.MemCached.AscIIClient.get(Unknown Source) [Memcached-Java-Client-3.0.2.jar:na]
        at com.schooner.MemCached.AscIIClient.get(Unknown Source) [Memcached-Java-Client-3.0.2.jar:na]
        at com.whalin.MemCached.MemCachedClient.get(Unknown Source) [Memcached-Java-Client-3.0.2.jar:na]
        at com.bst.common.tool.MemCachedUtil.get(MemCachedUtil.java:131) [MemCachedUtil.class:na]
        at com.bst.discount.service.impl.MemoryCachedService.getDiscountInfoByCode(MemoryCachedService.java:57) [MemoryCachedService.class:na]
        at sun.reflect.GeneratedMethodAccessor51.invoke(Unknown Source) ~[na:na]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_51]
        at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_51]
55 楼 kongshanxuelin 2014-08-28 10:20
当并发量大的时候感觉出现死锁,导致Tomcat下大量的live threads出现,悲催:

java.lang.Thread.State: RUNNABLE
at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:218)
at sun.nio.ch.IOUtil.read(IOUtil.java:186)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:359)
- locked <1aa3c8d> (a java.lang.Object)
at com.schooner.MemCached.SockInputStream.readFromChannel(Unknown Source)
at com.schooner.MemCached.SockInputStream.read(Unknown Source)
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2283)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2296)
at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2791)
at java.io.ObjectInputStream.readHandle(ObjectInputStream.java:1449)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1327)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
54 楼 YDY20082008 2013-05-17 11:56
java memcached怎么实现分布式处理,只需通过简单的配置?
53 楼 问风尘 2013-01-06 17:14
wjjava 写道
wjjava 写道
MengLee 写道
wjjava 写道
楼主你好,首先向你们所做的工作致敬!
近来我在使用你们开发的Memcached Java Client2.6.1时,遇到以下问题,一直没有解决,能帮我分析一下吗?
我向memcached中存基本对象时如String,时没有问题。
但是我向memcached中存序列化好的对象时,出现以下错误,请帮我看一看:
107366 [http-8080-1] ERROR com.danga.MemCached.MemCachedClient - ++++ exception thrown while trying to get object from cache for key: testVod77e266e-d238-4381-a90a-b812f5222f59
107366 [http-8080-1] ERROR com.danga.MemCached.MemCachedClient - org.apache.catalina.session.TestVo
java.io.IOException: org.apache.catalina.session.TestVo
at com.schooner.MemCached.ObjectTransCoder.decode(ObjectTransCoder.java:61)
at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:758)
at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:609)
at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:605)
at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:911)
at org.apache.catalina.session.MemcachedSession.getAttribute(MemcachedSession.java:27)
at org.apache.catalina.session.StandardSessionFacade.getAttribute(StandardSessionFacade.java:110)
at org.apache.jsp.test1_jsp._jspService(test1_jsp.java:90)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)


你可以利用我们的客户端直接向memcached存取Java 对象,而不必先序列化再存,我们的客户端会为你做序列化和反序列化的工作,例如:

TestClass tc = new TestClass("foo", "bar", new Integer(32));
mc.set("foo", tc);
TestClass tt = (TestClass) mc.get("foo");

但是,你必须保证这个类(TestClass)能够被client找到,也就是说你要把包含这个类定义的Jar文件包含到class path里面,不然客户端在反序列化的时候会报class not found的错误,这就是出现你上述错误地原因。


谢谢你的回复!
正如你所说,我把对象的Jar包放到class path之后,可以get出来了,但
是不能转化回来,报以下错误:
2011-8-5 19:00:47 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: org.apache.catalina.session.TestVo cannot be cast to org.apache.catalina.session.TestVo
at org.apache.jsp.test1_jsp._jspService(test1_jsp.java:66)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
这两个类是一样的啊,却不能转化,不知是什么原因。
还有就是如果新加类到memcached中都要把这个类放到class path中,感觉挺麻烦的,有没有方法杜绝呢?


我貌似找到原因了,放入memcached的对象跟本不用序列化,由client序列化,这样就不用把这个类放到class path中去了。
再次感谢楼主的回复!



你好,我也遇到这个问题,但是好像重启不影响使用,而且我java对象已经序列化过了,这个序列化过会有影响吗?? 谢谢
52 楼 gaowenming 2012-11-21 10:02
askylark 写道
askylark 写道
我也遇到了同样的问题,服务器是启动状态的,因为前面后面的set都正常,只是这个set出异常
java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:474)
        at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:205)
        at com.schooner.MemCached.SockInputStream.read(Unknown Source)
        at com.schooner.MemCached.SockInputStream.getLine(Unknown Source)
        at com.schooner.MemCached.AscIIClient.set(Unknown Source)
        at com.schooner.MemCached.AscIIClient.set(Unknown Source)
        at com.danga.MemCached.MemCachedClient.set(Unknown Source)

这个问题的解决办法:
使用binaryProtocal就可以了。
构造client的时候增加了参数true,使用binaryProtocal进行传输。

按照这个办法同样有问题
51 楼 gaowenming 2012-11-21 10:01
我也遇到了同样的问题,在测试环境没有问题,但是部署到生产环境,就出现如下的问题,等待解答,谢谢各位!
[2012-11-21 09:58:00,598]  [ERROR] [main] [c.s.M.AscIIClient:-1] - ++++ exception thrown while writing bytes to server on set
[2012-11-21 09:58:00,599]  [ERROR] [main] [c.s.M.AscIIClient:-1] - null
java.nio.BufferUnderflowException: null
at java.nio.Buffer.nextGetIndex(Buffer.java:474) ~[na:1.6.0_25]
at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:208) ~[na:1.6.0_25]
at com.schooner.MemCached.SockInputStream.read(Unknown Source) ~[java_memcached-release_2.6.6.jar:na]
at com.schooner.MemCached.SockInputStream.getLine(Unknown Source) ~[java_memcached-release_2.6.6.jar:na]
at com.schooner.MemCached.AscIIClient.set(Unknown Source) [java_memcached-release_2.6.6.jar:na]
at com.schooner.MemCached.AscIIClient.set(Unknown Source) [java_memcached-release_2.6.6.jar:na]
at com.danga.MemCached.MemCachedClient.set(Unknown Source) [java_memcached-release_2.6.6.jar:na]
at com.founder.barcode.bussiness.util.MemCacheUtil.putCache(MemCacheUtil.java:175) [MemCacheUtil.class:na]
at com.founder.barcode.bussiness.cache.CipherKeyCache.init(CipherKeyCache.java:40) [CipherKeyCache.class:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_25]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_25]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_25]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_25]
50 楼 huecome 2012-06-13 14:59
49 楼 gxlcliqi 2012-06-05 02:45
你好,有个问题,运行一段时间之后很多线程死在这个地方

在用户量更大的时候没有问题,但是在用户量相对较少的时候出现:

"http://*:8080-524" daemon prio=10 tid=0x00002aaab75df000 nid=0x7c17 in Object.wait() [0x000000006282d000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000077f570820> (a org.apache.commons.pool.impl.GenericObjectPool$Latch)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1123)
- locked <0x000000077f570820> (a org.apache.commons.pool.impl.GenericObjectPool$Latch)
at com.schooner.MemCached.SchoonerSockIOPool.getConnection(SchoonerSockIOPool.java:547)
at com.schooner.MemCached.SchoonerSockIOPool.getSock(SchoonerSockIOPool.java:485)
at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:693)
at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:630)
at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:626)

代码如下:
SockIOPool pool = SockIOPool.getInstance("dx_memcached");
pool.setServers(serverlist);
pool.setHashingAlg(SchoonerSockIOPool.NATIVE_HASH);
pool.setMaxIdle(1000 * 60 * 30);
pool.setMaxConn(600);
pool.setMinConn(100);
pool.initialize();

memcachedClient = new MemCachedClient("dx_memcached", false);
48 楼 estn_h 2012-05-29 00:15
求2.6.2jar包下载地址,谢谢!在github中找了一圈木有发现呢!谢谢
47 楼 askylark 2012-05-18 11:17
askylark 写道
我也遇到了同样的问题,服务器是启动状态的,因为前面后面的set都正常,只是这个set出异常
java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:474)
        at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:205)
        at com.schooner.MemCached.SockInputStream.read(Unknown Source)
        at com.schooner.MemCached.SockInputStream.getLine(Unknown Source)
        at com.schooner.MemCached.AscIIClient.set(Unknown Source)
        at com.schooner.MemCached.AscIIClient.set(Unknown Source)
        at com.danga.MemCached.MemCachedClient.set(Unknown Source)

这个问题的解决办法:
使用binaryProtocal就可以了。
构造client的时候增加了参数true,使用binaryProtocal进行传输。
46 楼 love123455555 2012-04-19 11:24
2.6.x 版本里边的 ErrorHandler 好像已经不能用了,请教一下,如果需要捕获异常需要用什么方法来代替?
45 楼 sankby 2012-04-13 11:23
我用memcached for win32 1.2.6 ,用这个客户端使用二进制协议访问,为什么发出命令之后,到读服务器返回值的时候就阻塞了?如果在发送的命令后添加 \r\n,不阻塞,但是返回ERROR。ascii协议没问题。
请问这个版本使用二进制协议访问,memcache需要什么版本,什么配置?
44 楼 askylark 2012-03-06 13:04
我也遇到了同样的问题,服务器是启动状态的,因为前面后面的set都正常,只是这个set出异常
java.nio.BufferUnderflowException
        at java.nio.Buffer.nextGetIndex(Buffer.java:474)
        at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:205)
        at com.schooner.MemCached.SockInputStream.read(Unknown Source)
        at com.schooner.MemCached.SockInputStream.getLine(Unknown Source)
        at com.schooner.MemCached.AscIIClient.set(Unknown Source)
        at com.schooner.MemCached.AscIIClient.set(Unknown Source)
        at com.danga.MemCached.MemCachedClient.set(Unknown Source)
43 楼 javcol 2011-12-22 17:57
/** 设置初始连接数5 */
static final int CACHE_INITCONN = 200;
/** 最小连接数 5**/
static final int CACHE_MINCONN = 5;
/****最大连接数 250 **/
static final int CACHE_MAXCONN = 1000;
/** 设置一个连接最大空闲时间6小时***/
static final int CACHE_MAXIDLE = 1000 * 60 * 60 * 6;
/** 设置主线程睡眠时间 每隔30秒醒来 然后 开始维护 连接数大小**/
static final int CACHE_MAINSLEEP = 10;  
/** // 设置tcp 相关的树形 关闭nagle算法 设置 读取 超时3秒钟 set the read timeout to 3 secs不设置连接超时 */
static final boolean CACHE_NAGLE = true;
static final int CACHE_SOCKETTO = 3000;
static final int CACHE_SOCKETCONNECTTO = 3000;
/****/
static final boolean CACHE_ALIVECHEK =true;
这是我的相关参数!!
42 楼 javcol 2011-12-22 17:56
在开发实现压力测试时,遇到memcached 遇到一个这样的问题!
是否那些相关的参数没有配置好呢/希望得到你们的帮助,谢谢!!

at com.schooner.MemCached.SchoonerSockIOPool.getConnection(SchoonerSockIOPool.java:540)
        at com.schooner.MemCached.SchoonerSockIOPool.getSock(SchoonerSockIOPool.java:452)
        at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:670)
        at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:609)
        at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:605)
        at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:911)
        at com.covics.memcached.client.Memcached.get(Memcached.java:145)
        at com.covics.bs.service.impl.AbstractBaseMcc.getInMccByKey(AbstractBaseMcc.java:65)
        at com.covics.bs.service.memcached.MemberMcc.getMemberInMccdByEmail(MemberMcc.java:104)
        at com.covics.meefon.service.member.MemberService.findTbMemberByEmailOrCode(MemberService.java:306)
        at com.covics.meefon.service.impl.Service_1_9.service_check_user(Service_1_9.java:375)
        at com.covics.meefon.service.impl.Service_1_9.service(Service_1_9.java:135)
        at com.covics.meefon.service.impl.AbstractBaseDataService.parseService(AbstractBaseDataService.java:213)
        at com.covics.meefon.service.impl.FactoryServiceImpl.logicService(FactoryServiceImpl.java:91)
        at com.covics.meefon.servlet.Portal.doPost(Portal.java:174)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)

41 楼 MengLee 2011-09-07 16:25
waterdh 写道
dennis_zane 写道
针对这个测试,有几点我可能需要说明下
1、首先是java memcached client可以用连接池,其实xmc也支持连接池,设置连接池的话,针对小数据的存取吞吐量会有一个提升,大并发下跟java memcached client没有差距。

2、大数据的存取,java memcached client去掉了压缩功能,比较的时候,其他client有没有将压缩的阈值设大来防止压缩,如果没有也是不公平的。


我觉得去掉压缩设置功能是个很大的败笔, 对用户不太友好,至少也要提供一个可选择的余地。server端一个slab最大容纳1M,存入大对象的时候压缩一下可以有效的利用memcached内存空间。

谢谢你的建议,我们会认真考虑。现阶段你可以自行压缩数据,然后存入memcached,取出数据之后,自行解压即可。
40 楼 waterdh 2011-09-07 12:21
dennis_zane 写道
针对这个测试,有几点我可能需要说明下
1、首先是java memcached client可以用连接池,其实xmc也支持连接池,设置连接池的话,针对小数据的存取吞吐量会有一个提升,大并发下跟java memcached client没有差距。

2、大数据的存取,java memcached client去掉了压缩功能,比较的时候,其他client有没有将压缩的阈值设大来防止压缩,如果没有也是不公平的。


我觉得去掉压缩设置功能是个很大的败笔, 对用户不太友好,至少也要提供一个可选择的余地。server端一个slab最大容纳1M,存入大对象的时候压缩一下可以有效的利用memcached内存空间。
39 楼 MengLee 2011-08-19 17:42
prolurker 写道
2.6.1这个版本,压测的时候有问题啊。
Exception in thread "Thread-1001" java.lang.OutOfMemoryError: Direct buffer memory
        at java.nio.Bits.reserveMemory(Bits.java:633)
        at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:98)
        at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)
        at com.schooner.MemCached.SchoonerSockIOPool$TCPSockIO.<init>(SchoonerSockIOPool.java:1327)
        at com.schooner.MemCached.SchoonerSockIOFactory.createSocket(SchoonerSockIOFactory.java:73)
        at com.schooner.MemCached.SchoonerSockIOFactory.makeObject(SchoonerSockIOFactory.java:43)
        at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1181)
        at com.schooner.MemCached.SchoonerSockIOPool.getConnection(SchoonerSockIOPool.java:513)
        at com.schooner.MemCached.SchoonerSockIOPool.getSock(SchoonerSockIOPool.java:452)
        at com.schooner.MemCached.AscIIClient.set(AscIIClient.java:360)
        at com.schooner.MemCached.AscIIClient.set(AscIIClient.java:227)
        at com.danga.MemCached.MemCachedClient.set(MemCachedClient.java:467)

而在2.5.1的时候则没有这个问题。

jvm的参数是-Xms1024m -Xmx1024m


能不能把你测试的参数告诉我?比如开了多少个线程,连接池大小,等等。
您也可以下载2.6.2的jar再试试。
38 楼 prolurker 2011-08-17 15:32
2.6.1这个版本,压测的时候有问题啊。
Exception in thread "Thread-1001" java.lang.OutOfMemoryError: Direct buffer memory
        at java.nio.Bits.reserveMemory(Bits.java:633)
        at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:98)
        at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)
        at com.schooner.MemCached.SchoonerSockIOPool$TCPSockIO.<init>(SchoonerSockIOPool.java:1327)
        at com.schooner.MemCached.SchoonerSockIOFactory.createSocket(SchoonerSockIOFactory.java:73)
        at com.schooner.MemCached.SchoonerSockIOFactory.makeObject(SchoonerSockIOFactory.java:43)
        at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1181)
        at com.schooner.MemCached.SchoonerSockIOPool.getConnection(SchoonerSockIOPool.java:513)
        at com.schooner.MemCached.SchoonerSockIOPool.getSock(SchoonerSockIOPool.java:452)
        at com.schooner.MemCached.AscIIClient.set(AscIIClient.java:360)
        at com.schooner.MemCached.AscIIClient.set(AscIIClient.java:227)
        at com.danga.MemCached.MemCachedClient.set(MemCachedClient.java:467)

而在2.5.1的时候则没有这个问题。

jvm的参数是-Xms1024m -Xmx1024m
37 楼 wjjava 2011-08-05 19:14
wjjava 写道
MengLee 写道
wjjava 写道
楼主你好,首先向你们所做的工作致敬!
近来我在使用你们开发的Memcached Java Client2.6.1时,遇到以下问题,一直没有解决,能帮我分析一下吗?
我向memcached中存基本对象时如String,时没有问题。
但是我向memcached中存序列化好的对象时,出现以下错误,请帮我看一看:
107366 [http-8080-1] ERROR com.danga.MemCached.MemCachedClient - ++++ exception thrown while trying to get object from cache for key: testVod77e266e-d238-4381-a90a-b812f5222f59
107366 [http-8080-1] ERROR com.danga.MemCached.MemCachedClient - org.apache.catalina.session.TestVo
java.io.IOException: org.apache.catalina.session.TestVo
at com.schooner.MemCached.ObjectTransCoder.decode(ObjectTransCoder.java:61)
at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:758)
at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:609)
at com.schooner.MemCached.AscIIClient.get(AscIIClient.java:605)
at com.danga.MemCached.MemCachedClient.get(MemCachedClient.java:911)
at org.apache.catalina.session.MemcachedSession.getAttribute(MemcachedSession.java:27)
at org.apache.catalina.session.StandardSessionFacade.getAttribute(StandardSessionFacade.java:110)
at org.apache.jsp.test1_jsp._jspService(test1_jsp.java:90)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:619)


你可以利用我们的客户端直接向memcached存取Java 对象,而不必先序列化再存,我们的客户端会为你做序列化和反序列化的工作,例如:

TestClass tc = new TestClass("foo", "bar", new Integer(32));
mc.set("foo", tc);
TestClass tt = (TestClass) mc.get("foo");

但是,你必须保证这个类(TestClass)能够被client找到,也就是说你要把包含这个类定义的Jar文件包含到class path里面,不然客户端在反序列化的时候会报class not found的错误,这就是出现你上述错误地原因。


谢谢你的回复!
正如你所说,我把对象的Jar包放到class path之后,可以get出来了,但
是不能转化回来,报以下错误:
2011-8-5 19:00:47 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: org.apache.catalina.session.TestVo cannot be cast to org.apache.catalina.session.TestVo
at org.apache.jsp.test1_jsp._jspService(test1_jsp.java:66)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
这两个类是一样的啊,却不能转化,不知是什么原因。
还有就是如果新加类到memcached中都要把这个类放到class path中,感觉挺麻烦的,有没有方法杜绝呢?


我貌似找到原因了,放入memcached的对象跟本不用序列化,由client序列化,这样就不用把这个类放到class path中去了。
再次感谢楼主的回复!

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • VB 高速双向链表,1亿次添加只需100毫秒

    内容索引:VB源码,其它类别,链表  VB实现超高速双向链表,非常高效的列表操作,1亿次列表数据添加仅需100毫秒以内。源代码关键字:   链表头、链表数据区、分配,清除内存、记录链表大小,链头,链尾、申请内存、设置表头数据、添加一个项,可指定index、清除链表所有数据、从index获取数据、链表查询、查找项(内置)根据内容,返回index及地址、将Soc移动至Dest、移除项(内置)根据地址移除……

  • 用VB制作数据结构课程中的二叉树控件.

    用VB制作数据结构课程中的二叉树控件.

  • VB中实现链表

    在VB中实现链表操作。内附详细注解。 可实现队列、堆栈、双向链表,纯环链表、MAP、集合、数据容器等功能。

  • 2.VB中的数据结构

    1.标识符 规则:字母或者下划线开头;不能使用VB关键字;不要使用特殊意义的标识符;不区分变量的大小写,一般来说首字母大写,符号常量均大写 x-y 错误,-号不能出现;1av错误,数字不可开头;不允许出现减号,空格 2.常量 直接常量:直接反应类型 系统常量:形式:vbcrlf 回车换行组合符 符号常量:形式:Const 符号常量名 [ As 类型] = 表达式 其...

  • 循环链表以及相关操作(VB实现)

                                  循环链表以及相关操作(VB实现)首先建立一个工程,然后增加一个类并且命名为(node,cls),在node.cls中加入以下代码.Option ExplicitPublic x As LongPublic count As LongPublic nextnode As node在Form1.frm中加入以下代码。Option Explic

  • VB-数组、集合、泛型

    变量、数组、集合、泛型的发展 最开始用内存中一个位置映射一个值,用变量来“使用”这个值。 进一步发展,用变量来引用一组值,这就是数组。由数组概念,发展出链表、堆、栈,进行排序、检索等。 但这并不能完全表达,由此发展出集合概念,它是更强大的数组,都依赖于Object基类。 随之而来的是集合中元素并不一定是...

  • 数据结构线性单链表

    数据结构线性单链表

  • VB.Net数据结构系列 第3章 栈和队列 3.2 队列

    1、构造函数之间相互调用 Me.New(别的带参数的构造函数的重载版本) Code3-2 Queue.vb: Public Class Queue Private queueArray() As Object Private growFactor As Integer Private head As Integer Private Const MinimumGrow As Integer = 4 Private Const ShrinkThreshol...

  • VB.Net程序设计:用队列控制多线程。

    Queuing Threads from the Generic Queue Class [VB.NET/C# Examples by AceInfinity] From:http://www.sysnative.com/forums/programming/1117-queuing-threads-generic-queue-class-%5Bvbulletin-net-c-examp

  • (CL3000)VB.Net:数据结构

    1、时钟 &lt;StructLayout(LayoutKind.Sequential)&gt; Structure ClockType Dim Second As Byte Dim Minute As Byte Dim Hour As Byte Dim Day As Byte Dim Month As B...

  • VB编程:VB运用数据结构-36

    运行效果: 程序代码: Private Type num       '定义一个新类型的数据,包含两个元素     num1 As Integer     num2 As Integer End Type Private Sub Command1_Click()     Dim number As num    '定义num类型的变量     number.num1...

  • 使用VB中的DataTable进行后端数据处理

    通过掌握DataTable的基本用法,我们可以在VB中高效地处理和操作数据。它提供了一种方便的方式来表示和操作数据表,并且可以进行各种数据操作,如添加、修改、删除和查询等。在上面的代码中,我们首先创建了一个名为"Employees"的DataTable对象,并添加了三列:“ID”,“Name"和"Age”。集合的索引和列名,我们可以轻松地访问和修改特定行和列的数据。在示例中,我们还演示了如何修改和删除DataTable中的数据。方法实现了一个简单的查询,通过指定筛选条件,返回符合条件的行数据。

  • vb.net中栈、队列、数组、列表、链表的使用。

    概述 数据结构实际上和算法关系很密切,很多算法的实现都配合数据结构来实现的,但是这不是这次内容,本次仅仅讲述各种数据结构的使用,至于实现,一篇文章根本不够讲。 栈的使用 栈在vb.net中用stack类封装,里面还有泛型栈stack(of T) 什么叫做栈呢?就像装乒乓球的纸筒,每个乒乓球就是栈的元素,先装进去的乒乓球位于筒的底部,后面的位于顶部。 在.net里用push表示把元素入栈,即把乒乓球...

  • VB.net编写的双向链表

    编写环境 VS2008 VB.net编写的双向链表, 支持 添加,插入,搜索, 排序,清除, 双向输出

  • LinkedList(极客时间)

    上次说了链表相关的基础知识。这次总结一些写链表代码的技巧,如果能熟练掌握这些技巧,就可以应对大多数链表的问题。 技巧一:理解引用的含义 事实上,看懂链表的结构并不是很难,但是一旦把它和面向对象的概念套在一起,就有挑战性了,但事实上,意思都是一样的,下面会用java的代码举例子。 我们可以把一个java代码实例化的时候,将实例理解为指针,指向创建的对象的地址。 Student s = new Stu...

  • 漫画算法笔记 链表实现

    漫画算法笔记 链表实现 #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; //C/C++代码实现 template&lt;typename T&gt; struct Node { T _data; Node&lt;T&gt; *_next; Node(T data) :_data(data) {}; }; template&lt;typename T&gt; class MyList { public

Global site tag (gtag.js) - Google Analytics