0 0

急求大婶指导redis Could not get a resource from the pool 异常10

功能:多台服务器同时访问redis中的队列
运行代码有时报错,有时正常,快要疯了,求大婶指导解决方案
报错信息:
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:22)
at com.bonc.text.service.crawler.RedisUtil.<init>(RedisUtil.java:24)
at com.bonc.text.service.crawler.DistributedCrawler.initCrawler(DistributedCrawler.java:53)
at com.bonc.text.service.crawler.DistributedCrawler.main(DistributedCrawler.java:80)
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)
... 3 more


源代码:

import java.io.BufferedInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

/**
 * 访问Redis工具类
 */
public class RedisUtil {
	
	public RedisUtil(){
		initialShardedPool();
		shardedJedis = shardedJedisPool.getResource();
	}
	// redis所在IP地址
	private static String IP;
	// 端口号
	private static int PORT_NUMBER;
	// 队列key值
	private static String KEY;
	//切片额客户端连接
	private static ShardedJedis shardedJedis;
	//切片连接池
    private static ShardedJedisPool shardedJedisPool;
    
	static{
		Properties prop = new Properties();
	    InputStream in;
		try {
			in = new BufferedInputStream(RedisUtil.class.getClass().getResourceAsStream("/craw.properties"));
			prop.load(in);
		    in.close();
		    
		    IP = prop.getProperty("IP");
		    PORT_NUMBER = Integer.parseInt(prop.getProperty("PORT_NUMBER"));
		    KEY = prop.getProperty("KEY");               
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
     * 初始化切片池 
     */ 
    private void initialShardedPool() {
        // 池基本配置 
        JedisPoolConfig config = new JedisPoolConfig();
        //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
        //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
        config.setMaxActive(-1);
        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
        config.setMaxIdle(50000);
        //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
        config.setMaxWait(10000 * 10000);
        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
        config.setTestOnBorrow(true);
        // slave链接
        List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(1000000);
        shards.add(new JedisShardInfo(IP, PORT_NUMBER));
        // 构造池
        shardedJedisPool = new ShardedJedisPool(config, shards);
    }
	
    /**
     * 返还到连接池
     * 
     * @param pool 
     * @param redis
     */
    public static void returnResource() {
        if (shardedJedis != null) {
        	shardedJedisPool.returnResource(shardedJedis);
        }
    }
    
	/**
	 * 从redis 队列尾部取一条数据,并删除
	 */ 
	public String getUrlByRedis() {
        String str = shardedJedis.lpop(KEY);
        returnResource();
		return str;
	}
	
	/**
	 * 从redis 队列头部插入一条数据,首先判断是否已存在于队列中
	 * @param url (待插入的URL)
	 */ 
	public boolean insertUrlToRedis(String url){
		
        long num = shardedJedis.lpush(KEY, url);
        returnResource();
    	if(num > 1) {
    		return true;
    	}
		return false;
	}
	
	/**
	 * 判断某一URL是否存在于队列中
	 * @param url
	 */
	public boolean isExist(String url) {
    	List<String> list = shardedJedis.lrange(KEY, 0, shardedJedis.llen(KEY));
    	returnResource();
    	if(list.contains(url)) {
    		return true;
    	}
		return false;
	}
	
	/**
	 * 判断redis url队列中是否空
	 */ 
	public boolean isNull() {
    	long length = shardedJedis.llen(KEY);
    	returnResource();
    	if(length == 0) {
    		return true;
    	}
		return false;
	}
	
	public static void main(String[] args) {

		RedisUtil ru = new RedisUtil();
		System.out.println(ru.insertUrlToRedis("http://134"));
	}
}

2014年8月20日 20:23
目前还没有答案

相关推荐

    分布式实现redis锁 出现错误Could not get a resource from the pool

    NULL 博文链接:https://sichen84.iteye.com/blog/2419876

    第02篇:Redis主从复制getshell1

    1、生成恶意.so文件,下载RedisModules-ExecuteCommand使用make编译即可生成 1、监听本地1234端口 2、将Redis服务器设置

    redis3.2+jedis2.8.jar+common-pool2.jar+common-pool2-source.rar

    try (Jedis jedis = pool.getResource()) { jedis.set("key", "value"); String value = jedis.get("key"); } ``` Jedis还支持事务操作,可以一次执行多个命令,保证原子性: ```java jedis.multi(); // 开始...

    redis 连接报错 GET_LIKE_ERROR 处理过程.rar

    redis 连接报错 GET_LIKE_ERROR 处理过程.rar

    最新连接redis数据库连接池commons-pool-2.5.0

    需要使用Redis连接池的话,还需commons-pool包,提供了强大的功能,包含最新的jar包

    redis安装集群用redis-3.0.0.gem

    redis-3.0.0.gem 执行gem install redis /usr/local/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError) ...from src/redis-trib.rb:25:in `&lt;main&gt;'

    redis缓存需要的jar commons-pool.jar jedis-1.5.2.jar

    在Redis客户端中,`commons-pool.jar`主要用于管理Redis连接池,确保高效地利用与Redis服务器的连接,避免频繁建立和关闭连接的开销。 `jedis-1.5.2.jar`是Jedis的早期版本,Jedis是一个用Java编写的Redis客户端,...

    Redis Essentials

    Redis Essentials is a fast-paced guide that teaches the fundamentals on data types, explains how to manage data through commands, and shares experiences from big players in the industry. We start off...

    redis.conf

    正确的redis.conf文件分享。Linux系统搭建redis集群,需要修改redis.conf里的端口号,当前文件端口号为7001.

    Redis 、Redis 连接池、JedisPool

    1.全网最强最好用redis 封装连接池,redis 配置详解 2.jar 内置最全 最安全的两种redis 连接池 创建方式(synchronized and look), 3.通过了自己公司生产环境的检测 4.使用方法:只需要将jar 放入项目 lib 下面 ...

    Centos7安装Redis安装说明

    Centos7安装Redis安装说明

    Java操作Redis,实现String、List、Map的set和get

    return jedisConnectionFactory.getResource(); } // 将上面的方法迁移到这里,并添加try-catch块 } ``` 然后编写Junit测试类`RedisServiceTest`: ```java @RunWith(SpringRunner.class) @SpringBootTest ...

    linux中安装redis和jedis及jedispool

    linux中安装redis和jedis及jedispool; redis安装所遇到的问题;

    redis_pool.zip

    from redis import Redis, ConnectionPool pool = ConnectionPool(host='localhost', port=6379, db=0) redis_client = Redis(connection_pool=pool) ``` 在这个例子中,我们创建了一个连接池,指定了Redis服务器的...

    Redis 的高并发实战:抢购系统 1

    当引擎层出现慢查询时,响应时间会延长,可能导致连接池耗尽,引发“Could not get a resource from the pool”的异常。 Redis 协议本身不支持连接收敛,消息没有 ID,使得请求和响应关联困难,类似于 HTTP 1.x。...

    java连接Redis所需jedis客户端包(jedis2.7+commons-pool2)

    try (Jedis jedis = pool.getResource()) { jedis.set("key", "value"); String value = jedis.get("key"); System.out.println("Value: " + value); } catch (Exception e) { e.printStackTrace(); } ...

    redis2.9.0+pool2.2

    在本场景中,我们关注的是Redis的Java客户端库Jedis以及连接池管理库Apache Commons Pool 2,具体版本为Jedis 2.9.0和Commons Pool 2.2。 **Jedis 2.9.0** Jedis是Java开发人员广泛使用的Redis客户端,它提供了丰富...

    redis-pool-jedis需要的jar包

    return pool.getResource(); } public static void returnResource(Jedis jedis) { jedis.close(); } } ``` 通过这样的设置,应用程序可以从连接池中获取Jedis实例,执行Redis操作后,再归还到池中以便复用。...

    redis-2.1.0 和commons-pool-1.5.6 Java测试redis values 类型

    5. **异常处理**: 在测试代码中,还需要考虑异常处理,如网络异常、超时异常等,确保程序在出现问题时能够优雅地处理并给出反馈。 6. **事务操作**: Redis支持简单的事务(Multi、Exec),测试代码可能会涉及如何在...

    phpredis linux源码

    4. **Resource Management** - `redis_resource.c` 管理 Redis 连接资源,确保每个连接的正确创建、使用和释放。 5. **Config Options** - `config.m4` 文件定义了编译时的配置选项,允许用户在编译扩展时自定义...

Global site tag (gtag.js) - Google Analytics