磁盘满时,redis客户端频抛出ConnectionException异常
2013-11-19 19:04
363 查看
1. 原因
当磁盘满时,程序在调用Pool.getResource(),从jedis实例池pool里借用实例时,出现连接异常,没有可用的jedis实例,异常log如下:
至于为啥磁盘满时,会抛ConnectionException异常,推测redis-server在同步数据到磁盘时出现异常,导致文件句柄连接的异常,同时也会拒绝了网络客户端的连接,如下:
2. 修改
2.1 客户端优化修改
2.2 服务端优化修改
由于redis中的热点数据仅有临时性的作用,所以在服务redis.conf配置文件中,禁用redis持久化功能,修改片段如下:
redisPool参数说明
参考
http://blog.csdn.net/freebird_lb/article/details/7460328
https://github.com/xetorthio/jedis/issues/206
/article/4621160.html
当磁盘满时,程序在调用Pool.getResource(),从jedis实例池pool里借用实例时,出现连接异常,没有可用的jedis实例,异常log如下:
2013-11-17 21:59:37,155 ERROR [TransportFrameEncoderService:97] main - <redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool Caused by: java.util.NoSuchElementException: Timeout waiting for idle object |
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error; nested exception is redis.clients.jedis.exceptions.JedisDataException: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
2. 修改
2.1 客户端优化修改
a、增加参数testOnReturn和testOnBorrow 为true,表示每次借用和归还jedis实例时,强行判断当前jedis实例是否可用 b、增加config.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_GROW),表示每次pool中没有可用的实例时,建新的jedis实例 c、修改逻辑:每次用完redis实例归还时,如果当前redis坏掉就不用归还,保证pool里面的实例都是可用的,代码摘要如下: if (redis != null) { pool.returnResource(redis); }
2.2 服务端优化修改
由于redis中的热点数据仅有临时性的作用,所以在服务redis.conf配置文件中,禁用redis持久化功能,修改片段如下:
#save 900 1 #save 300 10 #save 60 10000 |
maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态就成exhausted了,在JedisPoolConfig maxIdle:控制一个pool最多有多少个状态为idle的jedis实例; whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种WHEN_EXHAUSTED_FAIL(表示无jedis实例时,直接抛出NoSuchElementException)、WHEN_EXHAUSTED_BLOCK(则表示阻塞住,或者达到maxWait时抛出JedisConnectionException)、WHEN_EXHAUSTED_GROW(则表示新建一个jedis实例,也就说设置的maxActive无用); maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException; testOnBorrow:在borrow一个jedis实例时,是否提前进行alidate操作;如果为true,则得到的jedis实例均是可用的; testOnReturn:在return给pool时,是否提前进行validate操作; testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义; timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数; numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数; minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义; softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义; lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列; |
http://blog.csdn.net/freebird_lb/article/details/7460328
https://github.com/xetorthio/jedis/issues/206
/article/4621160.html
相关文章推荐
- 关于Remoting中的客户端调用服务端方法,在服务端抛出异常的原因及解决办法
- Redis客户端常见异常分析
- 如何解决WCF REST 中 WebFaultException抛出的异常客户端WebChannelFactory无法处理的问题
- 关闭rdlc报表打印预览后,关闭客户端,抛出异常“发生了应用程序级的异常 将退出”
- WCF服务端抛出的异常会跑到客户端
- WCF客户端不能用在Using语句块中,因为它可能会抛出不可预知的异常。即使你捕获了异常,仍有可能一直保持连接。
- redis客户端jedis的使用异常分析
- .Net Remoting 异常处理:从客户端截取服务端抛出的异常
- 关于客户端断开连接后服务器抛出异常Connection reset
- 在与sap系统集成时遇到的问题.sap系统发布一webservice,java(xfire)作为客户端调用,调用时抛出如下异常: Wrong Content-Type and empty HTTP-Body received: ("HTTP Code 20
- 有一个类为ClassA,有一个类为ClassB,在ClassB中有一个方法b,此方法抛出异常,在ClassA类中有一个方法a,请在这个方法中调用b,然后抛出异常。在客户端有一个类为TestC,有一个方
- Redis出现多线程调用时抛出 [B cannot be cast to java.lang.Long] 异常
- 使用struts2 做客户端校验时抛出freemarker模版错误异常的处理
- Redis客户端连接异常:Could not get resource from the pool 解决办法
- Redis客户端连接异常:Could not get resource from the pool 解决办法
- Redis客户端连接异常:Could not get resource from the pool 解决办法
- Redis客户端常见异常分析
- redis客户端连接异常
- 一个问题:关于finally中return吞掉catch块中抛出的异常
- hibernate open session in view 抛出异常解决方法