使用JedisPool回连接Twemproxy
使用JedisPool来连接Twemproxy
这里主要是配置的问题:
- <bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">
- <property name="maxActive" value="50" />
- <property name="maxIdle" value="10" />
- <property name="maxWait" value="1000" />
- <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();从连接池中获取连接的时候会对连接进行检验:
- if(_testOnBorrow &&!_factory.validateObject(latch.getPair().value)) {
- throw new Exception("ValidateObject failed");
- }
而检验的方法就是
- public boolean validateObject(final Object obj) {
- if (obj instanceof Jedis) {
- final Jedis jedis = (Jedis) obj;
- try {
- return jedis.isConnected() && jedis.ping().equals("PONG");
- } catch (final Exception e) {
- return false;
- }
- } else {
- return false;
- }
- }
看到了在JedisFactory里的实现,除了判断连接状态,还会通过Ping0来判断连接的可用性
而TwemProxy本身是不支持ping命令的。
解决方法:1,暂且设置testOnBorrow=false(默认值,其实还是不够的,因为TimerTask还是会去校验IDLE对象,如果真要这么干还要设置.testWhileIdle=false,后台不会校验到)
2,修改Proxy是器支持ping命令
转自:http://blog.****.net/luyee2010/article/details/17452733