JedisPool踩坑记录

JedisPool踩坑记录报错信息:Exceptioninthread”main”redis.clients.jedis.exceptions.JedisExhaustedPoolException:Couldnotgetaresourcesincethepoolisexhausted在网上找了很久没有找到,现在看来提示已经讲的很明白了,Jedis池耗尽异常:由于池已耗尽,无法获取资源原因就是最大连接数不够使用,我在类中启动了60个并发线程,然而连接池最大连接数只有50,所以报错。packa

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

报错信息:Exception in thread “main” redis.clients.jedis.exceptions.JedisExhaustedPoolException: Could not get a resource since the pool is exhausted

在网上找了很久没有找到,现在看来提示已经讲的很明白了,Jedis池耗尽异常:由于池已耗尽,无法获取资源

原因就是最大连接数不够使用,我在类中启动了60个并发线程,然而连接池最大连接数只有50,所以报错。

package com.wang.distributedlock.utils;

import org.springframework.beans.factory.annotation.Value;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author wzq
 * @date 2020/05/29/11:09
 */
public class JedisPoolUtil {

    @Value("${redis.host}")
    private static final String HOST = "127.0.0.1";

    @Value("${redis.port}")
    private static final int PORT = 6379;

    @Value("${redis.password}")
    private static final String PASSWORD = "123456";

    private static volatile JedisPool jedisPool = null;

    public static JedisPool getJedisPoolInstance() {
        if (jedisPool == null) {
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            // 最大连接数
            poolConfig.setMaxTotal(50);
            // 最大空闲连接数
            poolConfig.setMaxIdle(30);

            poolConfig.setMinIdle(10);
            // 最大等待时间
            poolConfig.setMaxWaitMillis(20 * 1000);
            // 检查连接可用性, 确保获取的redis实例可用
            // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的
            poolConfig.setTestOnBorrow(false);
            poolConfig.setTestOnCreate(false);

            // 无密码构造
            //jedisPool = new JedisPool(poolConfig, HOST, PORT);
            // 有密码构造,需要设置密码,设置密码可以在获取到jedis对象后,jedis.auth("密码"),也可以在此时使用构造入参设置
            jedisPool = new JedisPool(poolConfig, HOST, PORT, 10 * 1000, PASSWORD);

        }
        return jedisPool;
    }

    public static Jedis getJedisInstance() {
        Jedis jedis = getJedisPoolInstance().getResource();
        //jedis.auth("123456");
        return jedis;
    }

    public static void release(Jedis jedis) {
        jedis.close();
    }

}

引用的类中

package com.wang.distributedlock.zk;

import com.wang.distributedlock.utils.JedisPoolUtil;
import com.wang.distributedlock.utils.RedisTool;
import redis.clients.jedis.Jedis;

import java.util.UUID;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author wzq
 * date: 2019/12/23 11:28
 * description:
 */
public class OrderService implements Runnable {

    private static CyclicBarrier cb = new CyclicBarrier(60);

    // 订单号生成类
    // 将orderNumGenerator或者count任意一处加上static,getNumber()加上同步锁,依然是线程安全的,因为使用的是同一个generator,而且加了锁是线程安全的
    // 效果等同于静态锁,很多OrderService实例共用一把锁
    private OrderNumGenerator orderNumGenerator = new OrderNumGenerator();

    // 实现方式1
    //private DistributeLock lock = new ZookeeperDistributeLock();

    // 实现方式2
    //private DistributeLock lock = new ZookeeperDistributeLock2();

    /**
     * 这么多OrderService实例共用一把锁,可以保证线程安全,但在集群部署多机模式下,
     * 即便每台机器一次有一个请求获得锁,机器足够多依然会导致并发问题
     */
    private static Lock rtLock = new ReentrantLock();

    //实现方式3,redis分布式锁
    //private Jedis jedis = RedisTool.getJedis();
    private Jedis jedis = JedisPoolUtil.getJedisInstance();

    public void run() {
        try {
            cb.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }
        getNumber();
    }

    public void getNumber() {
        String requestId = UUID.randomUUID().toString();
        try {
            //lock.getLock();

            //rtLock.lock();

            // Redis服务端单机部署,需要回调
            // redis锁使用此段生成订单代码
            /*if (RedisTool.tryGetDistributedLock(jedis, "lock", requestId, 2000)) {
                String number = orderNumGenerator.getNumber();
                System.out.println(Thread.currentThread().getName() + "-" + System.currentTimeMillis() + ",产生了订单:" + number);
            } else {
                this.getNumber();
            }*/

            // zookeeper锁或者不加锁使用此段生成代码订单
            String number = orderNumGenerator.getNumber();
            System.out.println(Thread.currentThread().getName() + "-" + System.currentTimeMillis() + ",产生了订单:" + number);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //lock.unlock();

            //rtLock.unlock();

            //Redis服务端单机部署,需要回调
            //RedisTool.releaseDistributedLock(jedis, "lock", requestId);
        }
    }

    public static void main(String[] args) {

        System.out.println("####生成了订单####");
        for (int i = 0; i < 60; i++) {
            new Thread(new OrderService()).start();
        }

    }

}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197097.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 双边滤波加速「建议收藏」

    双边滤波器是同时考虑空间域和值域信息的类似传统高斯平滑滤波器的图像滤波、去噪、保边滤波器。其模板系数是空间系数d与值域系数r的乘积。其思想是:空间系数是高斯滤波器系数,值域系数为考虑了邻域像素点与中心像素点的像素值的差值,当差值较大时,值域系数r较小,即,为一个递减函数(高斯函数正半部分),带来的结果是总的系数w=d*r变小,降低了与“我”差异较大的像素对我的影响。从而达到保边的效果,同时

    2022年4月16日
    64
  • SQL Server 2008 R2 超详细安装图文教程

    SQL Server 2008 R2 超详细安装图文教程一、下载SQLServer2008R2安装文件ed2k://|file|cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso

    2022年7月3日
    19
  • Android listView长按删除

    Android listView长按删除AndroidlistView长按删除

    2022年7月22日
    18
  • 数学速算法_小学数学速算技巧全收录,寒假全面提升!

    数学速算法_小学数学速算技巧全收录,寒假全面提升!小编说:关注“学习方法报”免费获取更多学习干货,助你快速提分。想订阅报纸的各位童鞋请点击底部菜单——“微商城”查询答案的各位童鞋请点击底部菜单——“答案查询”——“小学答案”很多同学反映,自己的数学计算能力弱,每次数学考试,很多时间都花费在了计算上面,希望我能帮助他解决这个问题。所以今天我们就来和大家分享小学数学中的实用的速算技巧,同学们只要掌握了这个方法,计算问题一定会有一个大的提高!…

    2022年6月29日
    43
  • 构建算法模型_模型与算法有什么不同

    构建算法模型_模型与算法有什么不同文章目录1.情感词典内容2.情感倾向点互信息算法(SO-PMI)算法点互信息算法PMI情感倾向点互信息算法SO-PMI3.构建情感词典1.导入项目2.构建情感种子词3.使用TF-IDF方便构建情感种子词4.构建专业词典的效果与使用方法5.其他说明1.情感词典内容情感词典构建方法归为三类,分别是:词关系扩展法、迭代路径法和释义扩展法情感极性:正向、负向;表示正面情感(开心愉快)或负面情感(伤心愤怒)情感极值:情感倾向(微笑、开怀大笑、手舞足蹈虽然都可以表示开心,但有不一样的

    2022年8月23日
    3
  • applicationContext.xml配置简介「建议收藏」

    applicationContext.xml配置简介「建议收藏」spring的配置文件applicationContext.xml中的一些配置的作用。1.配置组件扫描器,使用注解方式开发<context:component-scanbase-package=”com.item.ikell”/>表示启动spring的组件扫描功能(从spring2.5版本开始)。即Spring容器初始化时,扫描base-package包或者子包下面的…

    2022年7月13日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号