redis jedis jedispool 获取不到连接

问题描述

redis jedis jedispool 获取不到连接

每次都在第8次获取 jedis的时候 获取不到

 package com.ryx.sync.util;

import java.util.concurrent.locks.ReentrantLock;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public final class JedisUtil {
    private static Logger logger = LoggerFactory.getLogger(JedisUtil.class);

    protected static ReentrantLock lockPool = new ReentrantLock();
    protected static ReentrantLock lockJedis = new ReentrantLock();
    //Redis服务器IP
    private static String ADDR = "127.0.0.1";

        //Redis的端口号
        private static int PORT = 6379;

        //访问密码
        private static String AUTH = "beijing";

        //可用连接实例的最大数目,默认值为8;
        //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
        private static int MAX_ACTIVE = 1024;

        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
        private static int MAX_IDLE = 8;

        //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
        private static int MAX_WAIT = 10000;

        private static int TIMEOUT = 10000;

        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
        private static boolean TEST_ON_BORROW = true;

        private static JedisPool jedisPool = null;

        /**
         * 初始化Redis连接池
         */
        private static void initialPool(){
            try {
                JedisPoolConfig config = new JedisPoolConfig();
//              config.setMaxTotal(MAX_ACTIVE);
                config.setMaxIdle(MAX_IDLE);
                config.setMaxWaitMillis(MAX_WAIT);
                config.setTestOnBorrow(TEST_ON_BORROW);
                jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
            } catch (Exception e) {
                logger.error("create JedisPool error : "+e);
            }
        }  

        /**
         * 在多线程环境同步初始化
         */
        private static void poolInit() {
            //断言 ,当前锁是否已经锁住,如果锁住了,就啥也不干,没锁的话就执行下面步骤
            assert ! lockPool.isHeldByCurrentThread();
            lockPool.lock();
            try {
                if (jedisPool == null) {
                    initialPool();
                }
            }catch(Exception e){
                e.printStackTrace();
            } finally {
                lockPool.unlock();
            }
        }  

        /**
         * 获取Jedis实例
         * @return
         */
        public static Jedis getJedis() {
            //断言 ,当前锁是否已经锁住,如果锁住了,就啥也不干,没锁的话就执行下面步骤
            assert ! lockJedis.isHeldByCurrentThread();
            lockJedis.lock();  

            if (jedisPool == null) {
                poolInit();
            }
            Jedis jedis = null;
            try {
                if (jedisPool != null) {
                    jedis = jedisPool.getResource();
                }
            } catch (Exception e) {
                logger.error("Get jedis error : "+e);
            }finally{
                lockJedis.unlock();
            }
            return jedis;
        }    

        /**
         * 释放jedis资源
         * @param jedis
         */
        public static void returnResource(final Jedis jedis) {
            if (jedis != null && jedisPool !=null) {
                jedisPool.returnResource(jedis);
            }
        }  

        public static JedisPool getJedisPool(){
            return jedisPool;
        }
}

public boolean jedisSave(List<SdTranData> sdTranDatas){
        if (sdTranDatas.size() <= 0) {
            return false;
        }
        Jedis jedis = null;
        try {
            //从redis 删除边界   tranCode  解决重复问题
            this.logger.logDebug("正在获取jedis连接。。。");
            jedis = JedisUtil.getJedis();
            System.out.println("active  jedis:"+JedisUtil.getJedisPool().getNumActive());
            this.logger.logDebug("获取jedis连接成功。。。");
            String tranCode = sdTranDatas.get(0).getTranCode();
            jedis.zremrangeByScore("sdTranLs".getBytes(), Double.parseDouble(tranCode), Double.parseDouble(tranCode));
            for (SdTranData sdTranData : sdTranDatas) {
                jedis.zadd("sdTranLs".getBytes(), Double.parseDouble(sdTranData.getTranCode()), SerializeUtil.serialize(sdTranData));
            }
        }catch (Exception e) {
            logger.logException("获取jedis连接出错:", e);
        }finally{
            if(jedis != null){
                JedisUtil.returnResource(jedis);
            }
        }
        return true;
    }

解决方案

程序其他地方 获取了连接,没关闭

时间: 2024-09-22 11:12:40

redis jedis jedispool 获取不到连接的相关文章

征服 Redis + Jedis

[本文转载于征服 Redis + Jedis] 用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis!   相关链接: 征服 Redis 征服 Redis + Jedis 征服 Redis + Jedis + Spring (一)-- 配置&常规操作(GET SET DEL) 征服 Redis + Jedis + Spring (二)-- 哈希表操作(HMGET HMSET) 征服 Redis + Jed

spring boot redis缓存JedisPool使用

spring boot redis缓存JedisPool使用 添加依赖pom.xml中添加如下依赖 <!-- Spring Boot Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency> redis配置文件 # RE

使用redis desktop manager获取数据超时问题

问题描述 使用redis desktop manager获取数据超时问题 如图,我在2017:1里面插入10万条数据,要获取它的时候就会出现连接超时. 求解,这个问题该怎么解决 解决方案 数据量太大了,redis性能会有影响,分批获取,比如用SCAN方式

asp获取数据库的连接属性的方法

  asp获取数据库的连接属性的方法 Option Explicit dim objCNN dim intCTProps dim item dim vbCRLF vbCRLF = chr(10) Response.Write "" & vbCRLF Response.Write " 春风精彩之查看数据库属性" & vbCRLF Response.Write vbCRLF set objCNN = Server.CreateObject("A

通信-求大神指导,实时获取蓝牙断开连接状态的方法?

问题描述 求大神指导,实时获取蓝牙断开连接状态的方法? 做一个和4.0蓝牙设备通信的安卓app. 要求能实时的显示蓝牙的状态,连接时显示连接好做. 但是测试的时候发现,主动关闭蓝牙设备后,手机端大概要10s左右的时间才会收到断开连接的回调 而且时间不固定,不确定是什么机制在不定时的判断连接是否断开. 做蓝牙的哥们说,蓝牙有一个监督超时时间可以设置,但我翻文档发现没有对应的api. 现在总是不能实时的获取断开状态.很苦恼,求大神指导. 解决方案 可以参照这篇文章:http://blog.csdn.

EWS 如何和获取邮件附件连接

问题描述 EWS如何和获取邮件附件连接求有经验的大大们告诉下如何获取邮件附件的连接来下载附件. 解决方案 本帖最后由 wkang201 于 2013-11-19 11:33:19 编辑解决方案二:邮件中附件数据为byte类型.

PHP获取网页所有连接的方法(附demo源码下载)_php技巧

本文实例讲述了PHP获取网页所有连接的方法.分享给大家供大家参考,具体如下: function getHtml($url, $charset='utf-8') { $curl = curl_init(); //curl_setopt($curl, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:192.168.168.1', 'CLIENT-IP:192.168.168.1'));//IP curl_setopt($curl, CURLOPT_URL, $u

Android获取当前已连接的wifi信号强度的方法_Android

本文实例讲述了Android获取当前已连接的wifi信号强度的方法,是Android程序开发中非常常见的重要技巧.分享给大家供大家参考之用.具体方法如下: 1.得到当前已连接的wifi信息 WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifi_service.getConnectionInfo(); 其中wifiInfo有以下的方法: wifiinfo.ge

Redis + Jedis + Spring整合遇到的异常(转)

  项目中需要用到缓存,经过比较后,选择了redis,客户端使用jedis连接,也使用到了spring提供的spring-data-redis.配置正确后启动tomcat,发现如下异常: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'redisTemplate' defined in class path resource [spring.xml