阿里华为技术专家教你如何实现一个Java连接池?(下)

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 阿里华为技术专家教你如何实现一个Java连接池?

发送命令时是直接操作RedisOutputStream写字节。


在多线程环境下复用Jedis对象,其实就是在复用RedisOutputStream。如果多个线程在执行操作,那么既无法确保整条命令以一个原子操作写入Socket,也无法确保写入后、读取前没有其他数据写到远端。


这就能解释了为何多线程下使用Jedis对象操作Redis会出现各种问题:

  • 写操作互相干扰,多条命令交织,必然是非法的Redis命令,则Redis会关闭客户端连接,导致连接断开
  • 线程1和2先后写入get a和get b请求,Redis也返回了值1和2,但是线程2先读取了数据1就会出现数据错乱的问题。


那么如何修复呢?

使用Jedis提供的线程安全的类JedisPool来获得Jedis的实例。JedisPool作为连接池,可以声明为static 被多线程共享。注意使用try-with-resources模式。

这样使用后代码不再有线程安全问题。最好再通过shutdownhook,在程序退出之前关闭JedisPool:


//

@PostConstruct
public void init() {
    Runtime.getRuntime().addShutdownHook(new Thread(() -> {
        jedisPool.close();
    }));
}

Jedis#close

若Jedis是从连接池获取的话,则close方法会调用连接池的return方法归还连接:

1.png

如果不是,则直接关闭连接,其最终调用Connection类的disconnect方法来关闭TCP连接:

1.png

可见Jedis可独立使用,也可配合连接池(JedisPool)

JedisPool

image.png

image.png

image.png

image.png

  • JedisPool继承JedisPoolAbstract又继承抽象类Pool,Pool内部持有Apache Common的GenericObjectPool。

1.png

所以JedisPool的连接池其实就是直接复用的GenericObjectPool,并没有自己实现一套池子。


综上,Jedis API属于连接池和连接分离的API,JedisPool是线程安全的连接池,Jedis是非线程安全的单一连接。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2天前
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
16 4
|
3天前
|
Java 程序员 开发者
掌握Java异常处理:从新手到专家
在Java的世界中,异常是程序运行中不可忽视的挑战。本文以浅显易懂的语言,引导你认识Java中的异常处理机制,从基础的try-catch语句到深入的自定义异常和最佳实践,让你在遇到运行时错误时能够从容不迫,优雅地处理每一个可能的异常情况。让我们一起走进Java异常的世界,学习如何驯服这些“野性”的错误,让程序更加健壮和可靠。
|
4天前
|
Java
Java BasePooledObjectFactory 对象池化技术
Java BasePooledObjectFactory 对象池化技术
8 1
|
10天前
|
安全 Java 数据库连接
Java中的异常处理:从新手到专家
在Java编程的海洋里,异常处理是一块不可或缺的救生板。本文将带你领略异常处理的重要性,并深入探讨如何在Java中优雅地处理这些不期而遇的波涛。从基础的try-catch语句到高级的自定义异常和最佳实践,我们的目标是让每位读者都能在面对异常时游刃有余,确保代码的稳健与优雅。
17 2
|
14天前
|
安全 Java
Java RMI技术详解与案例分析
在实际的银行系统中,当然还需要考虑安全性、事务性、持久性以及错误处理等多方面的因素,RMI的网络通信也需要在安全的网络环境下进行,以防止数据泄露或被篡改。你在应用中是怎么使用 RMI 的,欢迎关注威哥爱编程,一起交流一下哈。
132 4
|
4天前
|
存储 设计模式 安全
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
5 0
|
26天前
|
Java 运维
开发与运维技术问题之ava对象头压缩技术支持所有的Java垃圾回收器如何解决
开发与运维技术问题之ava对象头压缩技术支持所有的Java垃圾回收器如何解决
21 1
|
7天前
|
Java 数据库连接 开发者
Java中的异常处理:从新手到专家
在Java编程的世界中,异常处理是每位开发者必须精通的技能。本文将引导您了解Java异常处理的基础知识,深入探讨高级技巧,并分享最佳实践,帮助您从初学者成长为熟练处理各种异常情况的专家。
|
1月前
|
存储 安全 算法
Java中的数据脱敏与隐私保护技术
Java中的数据脱敏与隐私保护技术
|
29天前
|
Java Spring
Java演进问题之Spring框架使用技术实现其核心功能如何解决
Java演进问题之Spring框架使用技术实现其核心功能如何解决