PostgreSQL中常用的几种连接池总结及更新

前言

PostgreSQL的多进程结构,使得在支持大规模连接的时候,服务器端显得比较吃亏。一般上了1000个连接以上的时候,系统就会受到很大影响。这个时候,使用连接池,优势就会突显出来了。

在云环境下,一个JAVA应用服务,可能会启动成多个进程实例,而每个进程实例又依赖于java的数据库连接池,不管是Hikari,还是阿里的druid,还是其他的一些所谓的高性能连接池,因为都是基于连接会话的,最终并不能对总的连接进程数有多大缓解。

在唐成老师的ZQPool 1.3 发布一文中,甚至对此都有吐糟。

而使用第三方连接池的一个很重要的目的就是:(引自上边的文章)

减少短连接应用花在新建数据库连接的时间。PostgreSQL数据库对每一个连接需要fork出一个新的进程来提供服务,而每次fork一个进程是需要时间的。而连接池软件可以预先建好到数据库的连接,应用程序连接到连接池软件后,连接池软件可以从池中取一个已经建好的连接马上提供服务,这样就大大减少了新连接的时间。这个场景的典型应用是php应用。php应用到数据库通常是短连接。

总进程数不能缓解的问题,ZQPool彻底解决了。不能不说是一件快事。

分析与总结

既然是好消息连连,我们就一个个总结:

1、Odyssey连接池

详细信息见我前段时间总结出来的:

高可用: 体验使用Odyssey连接池(一)

高可用: 体验使用Odyssey连接池(二)

总的印象是,系统资源开销小。但是目前似乎仍未解决总连接数受制于总会话数的问题。同时,用户密码验证,最多只能用到MD5。与里边的开发人员沟通过,说scram-sha-256的完全支持也应该是可以的,需要再重新验证和fix。

2、pgbouncer

我要说的是,最新版本的pgbouncer开始支持statement、transaction级别的真正复用了。

以前在使用这两级复用的时候,经常出下边的错:

org.postgresql.util.PSQLException: ERROR: prepared statement "S_1" already exists 

解决了这些问题,那么就可以更加稳健的使用statement level的连接池了。

PgBouncer 1.21.0  (http://www.pgbouncer.org/2023/10/pgbouncer-1-21-0)在10月16号的时候宣布得以解决。

Oct 16, 2023 - PgBouncer 1.21.0

PgBouncer 1.21.0 has been released. This release adds one of PgBouncer its most requested features: Support for named prepared statements! See the docs on max_prepared_statements for details on how the feature works, its limitations, and how to tune the value of the max_prepared_statements setting.

Apart from prepared statement support this release also includes various other improvements, such as much more secure default TLS settings and changes required for FIPS compliance. And it also fixes various bugs and crashes.

See the full details in the changelog.

Download here: pgbouncer-1.21.0.tar.gz (sha256)

3、国产的ZQPool

看了zqpool的介绍,使用方法是真的简单明了。

具体可以参照 :ZQPool 1.3 发布:https://mp.weixin.qq.com/s/OVZoVyP1MWqi1MK37u2TDQ

https://gitee.com/csudata/zqpool/releases/tag/1.3

zqpool#安装教程: https://gitee.com/iihero/zqpool#%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B

使用的是GO语言开发。编译安装也简单。直接make。也提供二进制包下载。

ZQPool简单使用说明

配置zqpool.conf文件,各个配置项说明如下:

  • listen_port = 5436 : 设置zqpool的监听端口

  • listen_addr = * : 设置zqpool的监听IP,设置为*,表示在本地的所有IP地址上监听

  • mgr_port = 9380 : 管理端口

  • mgr_addr = * : 管理端口监听的地址

各个连接池的配置:

  • pool.1.fe_max_conns = 3000

  • pool.1.fe_user=mydb

  • pool.1.fe_passwd=test12

  • pool.1.fe_dbname=mydb2

  • pool.1.be_user=mydbabc

  • pool.1.be_passwd=test12

  • pool.1.be_dbname=mydb123

  • pool.1.be_conns = 10

  • pool.1.be_ipport=172.22.224.10:5432,172.22.224.10:5411

  • pool.1.be_conn_life_time=60 # 指定连接的life_time,当连接超过这个时间后,会被销毁重连,主要是为了防止内存泄漏

fe_指的就是frontend, 就是前端访问zqpool的服务端口等信息。非常明了。

它似乎是兼顾考虑到了目前各种轻量级连接池的优点。因为它解决了上边接到的Prepare语句不能复用的问题。同时开销也非常小。能支持更大的并发量。相信它有很好的使用机会。

再看了看它的license: 

木兰公共许可证, 第2版
木兰公共许可证, 第2版
2021年5月 http://license.coscl.org.cn/MulanPubL-2.0

看不出使用它有多大的风险。

同时也说说它安全性上的特点:

上边的配置文件里头有明文的密码。我没试过,不加入那些密码项,是不是也能工作?还有它目前只支持password_encryption=md5的用户连接。与Odyssey一样。如果作为一个不断增强的软件而言,相信以后它会在这方面会做一些加强性的工作。那样才能让用户更加放心的使用。

对这三种连接池,推荐使用:pgbouncer -> zqpool->Odyssey

甚至可以是哪个熟练有把握,就用哪个。相信功能也都会越来越健壮。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis quicklist源码+listpack源码(5.0版本以上的优化)

ziplist设计上的问题,每一次增删改都需要计算前面元素的空间和长度(prevlen),这种设计缺陷非常明显,因此引入了quicklist的设计。 quicklist quicklist实际就是双端链表,链表里的每一个节点都是ziplist&a…

Python---函数递归---练习:猴子吃桃问题(本文以递归算法 解法为主)

相关链接:Python---函数递归---练习:斐波那契数列(本文以递归算法为主)-CSDN博客 案例:猴子吃桃问题 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。…

类和对象——(5)定义对象数组

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 芳华没有草稿纸,我们永久不…

曲线积分和路径无关条件和应用

文章目录 平面上曲线积分和路径无关条件曲线积分与路径无关的定义等价描述小结充要条件定理充分性必要性 说明 线积分与路径无关时的计算👺曲线积分与路径无关的三个等价命题等价结论 Newton-Leibniz二元函数形式积分路径的简化 应用例例 平面上曲线积分和路径无关条…

UVa1584环状序列题解

题目 长度为n的环状串有n种表示方法,分别为从某个位置开始顺时针得到,在这些排列中字典顺序最小的称“最小表示”。 如CTCC的最小表示为CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。 提示:对于两个字符串,从第一个字符开始…

openEuler学习05-ssh升级到openssh-9.5p1

openEuler的版本是openEuler 20.03,ssh的版本是OpenSSH_8.2p1 [roottest ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-…

【Google2023】利用TiDE进行长期预测实战(时间序列密集编码器)

一、本文介绍 大家好,最近在搞论文所以在研究各种论文的思想,这篇文章给大家带来的是TiDE模型由Goggle在2023.8年发布,其主要的核心思想是:基于多层感知机(MLP)构建的编码器-解码器架构,核心创…

Python---函数递归---练习:斐波那契数列(本文以递归算法为主)

编程思想: 如何利用数学模型,来解决对应的需求问题;然后利用代码实现对应的数据模型。 算法:使用代码实现对应的数学模型,从而解决对应的业务问题 程序 算法 数据结构 在经常使用的算法中,有两种非常…

RC低通滤波电路直接带载后会发生什么?

1、滤波的含义 滤波是频域范畴,它说的是不同频率的信号经过一个电路处理后,信号发生变化的问题,变化包含了原始信号幅值和相位的变化,滤波电路对信号的幅值做出的响应称为幅频响应,对信号相位做出的反应称为相频响应。…

设计模式---第五篇

系列文章目录 文章目录 系列文章目录前言一、知道观察者模式吗?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、知道观察者模式吗? 答:观察者模式是定义对…

逸学java【初级菜鸟篇】12.网络通讯编程

hi,我是逸尘,一起学java吧 目标(任务驱动) 请练掌网络通讯的内容。 局域网和互联网 局域网英文:Local Area Network,缩写:LAN,是指一群通过一定形式连接起来的计算机,…

Java封装讯飞星火大模型历险记

问题描述与分析 现状描述与目标 在使用讯飞星火大模型API的过程中,API的返回结果在可以在其他线程中进行分次打印,但是在main方法中直接打印返回结果,显示为空。这种情况下不利于二次封装,希望在main方法中获取完整的API返回结果…

Linux——基本指令(一)

写在前面: 我们云服务器搭建的Linux系统,使用的镜像版本CentOS 7.6,使用的Xshell远程连接云服务器 前面我们使用超级管理员root账号登录,一般我们使用普通用户登录,那么如何创建新用户呢? 1.创建新用户 &#xff08…

Ubuntu22.04无需命令行安装中文输入法

概要:Ubuntu22.04安装完成后,只需在设置中点点点即可完成中文输入法的安装,无需命令行。 一、安装中文语言包 1、点击屏幕右上角,如下图所示。 2、点击设置 3、选择地区与语言,点击管理已安装的语言 4、点击安装 5、输…

KALI LINUX附录

预计更新 第一章 入门 1.1 什么是Kali Linux? 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 …

docker: Error response from daemon: network hm-net not found.

在使用Docker部署RabbitMQ的时候出现错误:docker: Error response from daemon: network hm-net not found. docker run \-e RABBITMQ_DEFAULT_USERuser \-e RABBITMQ_DEFAULT_PASS123456 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5…

java对象的创建过程是怎样的?

Java对象的创建过程主要分为五个步骤: 1. 加载类信息:当我们使用new关键字来创建一个对象时,首先会去检查这个类的信息是否已经被加载到内存中。如果没有加载,就会先加载。 2. 分配内存空间:在JVM的堆内存中为新的对…

ElasticSearch之Analyze index disk usage API

本API用于分析、统计指定index当前占用的存储空间。 考虑到本特性目前仍然处于预览状态,因此使用方法、参数等可能会发生变化,或者未来也许会被删除。 本API暂时不建议在生产系统中使用。 命令样例如下: curl -X POST "https://localh…

目标检测YOLO系列从入门到精通技术详解100篇-【图像处理】图像识别

目录 知识储备 OpenCV中的图像形态学 基于图像识别的水位测量 目标图像的提取和预处理

PHP常见错误

初学者在编程时,经常会遇到各种错误,那么如何 正确的处理错误则是可以提高开发效率。 一:错误(Error) 1.1 什么是错误及错误的级别 错误是指在开发阶段中由一些失误引起的程序问题,根据其出现在编程过程…