`
kavy
  • 浏览: 864629 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用JedisPool来连接Twemproxy

 
阅读更多

这里主要是配置的问题:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">  
  2. <property name="maxActive" value="50" />   
  3. <property name="maxIdle" value="10" />   
  4. <property name="maxWait" value="1000" />   
  5. <property name="testOnBorrow" value="true />   


这里的配置testOnBorrow只能配置为false  否则会报错

 

Caused by: java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1233)
at redis.clients.util.Pool.getResource(Pool.java:20)

原因:通过 JedisPool.getResource();从连接池中获取连接的时候会对连接进行检验:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. if(_testOnBorrow &&!_factory.validateObject(latch.getPair().value)) {  
  2.       throw new Exception("ValidateObject failed");  
  3.  }  

 

 

而检验的方法就是

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. public boolean validateObject(final Object obj) {  
  2.         if (obj instanceof Jedis) {  
  3.             final Jedis jedis = (Jedis) obj;  
  4.             try {  
  5.                 return jedis.isConnected() && jedis.ping().equals("PONG");  
  6.             } catch (final Exception e) {  
  7.                 return false;  
  8.             }  
  9.         } else {  
  10.             return false;  
  11.         }  
  12.     }  


看到了在JedisFactory里的实现,除了判断连接状态,还会通过Ping0来判断连接的可用性

 

而TwemProxy本身是不支持ping命令的。

解决方法:1,暂且设置testOnBorrow=false(默认值,其实还是不够的,因为TimerTask还是会去校验IDLE对象,如果真要这么干还要设置.testWhileIdle=false,后台不会校验到)

                  2,修改Proxy是器支持ping命令

 

转自:http://blog.csdn.net/luyee2010/article/details/17452733

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics