WTF连接池

让我们谈谈连接池。

我声称:

大多数流行的连接池的默认设置都很差!

对您来说,这意味着:

去查看您的连接池设置。

如果您依赖默认设置,则可能会遇到问题。 您可能有内存泄漏和应用程序无响应(即使负载根本不高)。

下面,我将显示一些最重要的设置以及我的建议,这些设置应如何配置。

什么是连接池?

一个普通的Web应用程序需要从数据库写入或读取数据,它的操作如下:

  1. 打开到数据库的连接//需要N毫秒
  2. 读/写数据
  3. 关闭连接

(顺便说一下,在旧的良好CGI应用程序中,这是唯一可能的方法)

在许多情况下,此方法非常好。 而且您可能不需要更多。 但这对于高性能系统有一些缺点

  • 步骤1可能需要一些时间。 大概几十或几百毫秒(当然,要视情况而定)。
  • 很容易忘记第3步(关闭连接),这会导致连接泄漏 (导致内存泄漏和其他问题)。

新英雄

这就是诞生另一种方法的原因:应用程序可能会预先打开一堆连接并一直保持打开状态。 一堆打开的连接称为连接池 。 然后任何操作如下所示:

  1. 在大多数情况下,从池中//快速建立数据库连接
  2. 读/写数据
  3. 将连接返回到池

看起来很酷。 但是,新的力量总是意味着新的问题。

…以及新问题

使用连接池时,我们需要(至少)解决以下问题

  • 我们应该保持多少连接?
  • 应该保留多长时间?
  • 如果它们看起来坏了怎么办?
  • 如果应用程序需要的连接数比当前池更多,该怎么办?
  • 如果有人忘记将连接恢复到池怎么办?

为了回答这些问题,连接池有很多设置。 而且它们的默认值大多不好。 感兴趣吗? 让我展示。

基本设置

我将考虑Java世界中2个最流行的连接池:

  • C3P0( https://www.mchange.com/projects/c3p0/ )
  • HikariCP( https://github.com/brettwooldridge/HikariCP )

原因的基本参数是:

  • 最小大小(随时应打开的最小连接数)
  • 初始大小(启动时打开了多少个连接应用程序)
  • 最大大小(池中的最大连接数)

顺便说一下,这些是唯一具有合理默认值的设置。 他们来了:

c3p0 光ikaCP
最小尺寸 3 10
初始尺寸 3 10
最大尺寸 15 10

让我们继续进行更多有问题的设置。

关键设置

结帐超时

应用程序可以等待多长时间,直到它从池中获得连接。

  • c3p0设置:checkoutTimeout
  • HikariCP设置:connectionTimeout

默认值:

c3p0 光ikaCP 我建议
checkoutTimeout 30秒 1毫秒

这两个默认值都只是灾难。

正如我提到的,在大多数情况下,从池中获取连接非常快。 除非池中没有打开的连接。 然后,池需要获取一个新的连接(通常需要不到一秒钟的时间)。 但是,如果达到maxSize,则池无法打开新的连接,而只是等到有人将其连接返回到池中。 但是,如果应用程序存在连接泄漏(阻止连接返回的错误),则池将永远无法恢复连接!

那会发生什么呢?

对于c3p0,我们最终将所有线程冻结为以下状态:

"qtp1905485420-495 13e09-3211" #495 prio=5 os_prio=0 tid=0x00007f20e078d800 nid=0x10d7 in Object.wait() [0x00007f204bc79000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable()- locked <0x00000000c3295ef8> (a com.mchange.v2.resourcepool.BasicResourcePool)at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource()…at org.hibernate.jpa.internal.QueryImpl.getResultList()at domain.funds.FundsRepository.get()…

似乎HikariCP的默认“ 30秒”要好一些。 不,它在高性能应用程序中并没有真正的帮助。 在这30秒内,可能会收到许多新请求,并且所有请求都被冻结。 显然,应用程序将很快收到OutOfMemory错误。 任何等待只会将应用程序的终止延迟几秒钟。

这就是为什么我建议将checkoutTimeout设置为最小可能值:1ms。 不幸的是,我们不能将其设置为0,因为0意味着无尽的等待&#55357;&#56898; 我们越早失败,我们给工作线程完成工作的机会就越大。 而且我们可以清楚地通知用户该应用程序当前已超载,他应该稍后再试。

在结帐时测试连接

有时池中的连接可能会死。 数据库可以主动关闭它们,或者系统管理员可以断开网络电缆。 这就是池应该监视连接活动性的原因。

最简单的设置是c3p0中的“ testConnectionOnCheckout”(我在HikariCP中没有找到类似的设置,它似乎一直处于启用状态)。

默认值:

c3p0 光ikaCP 我建议
testConnectionOnCheckout 真正? 真正

当然,默认情况下应该启用它

否则,您将在日志中遇到许多此类异常:

org.hibernate.TransactionException: Unable to rollback against JDBC Connection
at o.h.r.j.i.AbstractLogicalConnectionImplementor.rollback()
at o.h.r.t.b.j.i.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.rollback(JdbcResourceLocalTransactionCoordinatorImpl.java:294)

PS如果要获得更好的性能,可以考虑在后台而不是在结帐时测试连接:

  • testConnectionOnCheckout = false
  • testConnectionOnCheckin = true
  • idleConnectionTestPeriod = 10

首选测试查询

但是池应该如何准确地测试连接?

问题在于它取决于数据库。

默认情况下,两个池都通过执行测试连接

  • “ connection.isValid()”(对于JDBC4),或者
  • “ connection.getMetaData()。getTables()”(对于JDBC3)

这可能很慢,因为“ getTables()”每次都检索有关所有表的元信息。 推荐值类似于

  • “ SELECT 1”(对于MySql),或者
  • “从双重选择1”(对于Oracle)等

通过执行此简单而快速的查询,池可以检查连接是否仍处于活动状态。

最大空闲时间

未使用的连接可以在池中保留多长时间

  • c3p0设置:maxIdleTime
  • HikariCP设置:idleTimeout

默认值:

c3p0 光ikaCP 我建议
maxIdleTimeout 10分钟 1..10分钟

可能没什么大不了的,但是每个打开的连接

  • 在数据库中保存一些资源
  • 防止其他系统获得到同一数据库的连接(每个数据库都有最大可能连接数的限制)

因此,关闭未使用的(空闲)连接是个好主意。 我建议将此值设置为无限期。 大概几分钟是合理的。

最小泳池大小

应始终具有多少个连接池(即使未使用)。

  • c3p0设置:minPoolSize
  • HikariCP设置:minimumIdle

默认值:

c3p0 光ikaCP 我建议
maxIdleTimeout 3 最大游泳池 0…N

出于同样的原因,关闭未使用的连接可能是一个好主意。 在大多数情况下,我会将此值设置为0或1。 如果某些用户意外决定在午夜登录到您的应用程序,他将只等待几毫秒。 没有大碍。

最大连接年龄

连接可以在池中生存多长时间(无论它是空闲还是已使用)

  • c3p0设置:maxConnectionAge
  • HikariCP设置:maxLifetime

默认值:

c3p0 光ikaCP 我建议
maxIdleTimeout 30分钟 比方说30分钟

以防万一,不时关闭连接可能是一个好主意。 可能有助于避免某些内存泄漏。

来自HikariCP文档的报价:

“我们强烈建议设置此值,它应该比任何数据库或基础结构施加的连接时间限制短几秒钟。”

未返回的连接超时

典型的问题之一是连接泄漏。 一些错误的代码从池中获取了一个连接,但没有返回它。 如何发现这个问题?

幸运的是,在这种情况下,我们有一个很好的设置:

  • c3p0设置:unreturnedConnectionTimeout
  • HikariCP设置:leakDetectionThreshold

默认值:

c3p0 光ikaCP 我建议
maxIdleTimeout 残障人士 残障人士 5分钟?

如果有任何错误代码在5分钟内未建立连接并返回连接,则池将强制返回连接并发出如下警告:

[C3P0PooledConnectionPoolManager Logging the stack trace by which the overdue resource was checked-out.
java.lang.Exception: DEBUG STACK TRACE: Overdue resource check-out stack trace.
at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource()
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1885)
at domain.application.ApplicationReportSender.sendWeeklyReport(ApplicationReportSender.java:63)

这将帮助您找出有罪代码在哪里。

结论

我概述了一些连接池设置。 还有更多。 根据我的经验,我给出了一些合理的建议。 但是您的应用程序可能具有不同的负载。 您的用户可能会有不同的行为。 我的建议对您来说似乎很愚蠢。

没问题。 不要相信我 但也请不要相信默认值。

去检查你的游泳池设置!

翻译自: https://www.javacodegeeks.com/2018/12/wtf-connection-pools.html

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

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

相关文章

安卓跑linux程序_Android下运行Linux可执行程序

2019-07-22关键字&#xff1a;/system/bin/sh: xxx: No such file or directory虽然说 Android 也是基于 Linux 的&#xff0c;但总归来说它们的编译链还是很有可能不一样的&#xff0c;这就导致编译出来的程序有可能不能通用&#xff0c;即使它们都是基于 Linux 的。而有些不能…

[渝粤教育] 中国地质大学 计算机文化基础 复习题

《计算机文化基础》模拟题 一、单项选择题 1.自然界中常见的光能够由()三种颜色混合而成. A.红黄绿 B.红绿蓝 C.澄蓝紫 D.白红绿 2.显示器彩电等成像显示设备的工作是基于()三色原理. A.RYG(红黄绿) B.WRG(白红绿) C.RGB(红绿蓝) D.CMY(青品红黄) 3.PentiumIICPU是()位处理器…

最常见的SQL报错注入函数(floor、updatexml、extractvalue)及payload总结

SQL报错注入是一种常见的SQL注入攻击方式&#xff0c;攻击者通过注入恶意代码&#xff0c;触发数据库的错误响应&#xff0c;并从错误信息中获取有用的信息。 下面介绍最常见的三个报错注入函数用法及payload总结&#xff1a; 1、floor() 使用floor报错注入&#xff0c;需要…

光电转换器与光纤收发器有哪些区别?

说到光电转换器&#xff0c;我们都知道光电转换器是一种类似于基带MODEM&#xff08;数字调制解调器&#xff09;的设备&#xff0c;和基带MODEM不同的是接入的是光纤专线&#xff0c;是光信号&#xff0c;分为全双工流控&#xff0c;半双工背压控制。那么&#xff0c;光电转换…

[渝粤教育] 中国地质大学 马克思主义基本原理 复习题

《马克思主义基本原理》 一.单选题 1.思维与存在的关系问题是() A.唯心主义哲学的基本问题 B.唯物主义哲学的基本问题 C.全部哲学的基本问题 D.一部分哲学的基本问题 2.金融资本是() A.银行垄断资本和工业垄断资本相互渗透融合生长而形成的新型的资本形态. B.银行垄断资本. C.…

如何查看spark消耗的内存_Spark优化(三)----数据本地化及内存调优

1. 数据本地化的级别&#xff1a;1.PROCESS_LOCAL2.NODE_LOCAL3.NO_PREF4.RACK_LOCAL5.ANY1) PROCESS_LOCALtask要计算的数据在本进程&#xff08;Executor&#xff09;的内存中。2) NODE_LOCAL① task所计算的数据在本节点所在的磁盘上。② task所计算的数据在本节点其他Execu…

[渝粤教育] 西南科技大学 数据库应用 在线考试复习资料(1)

数据库应用——在线考试复习资料 一、单选题 1.“表达式生成器”是用来书写什么的? A.代码 B.程序 C.表达式 D.数据库 2.在使用计算控件时,每个表示式前必须加上哪种运算符号? A. B. C.? D.* 3.以下属于非绑定控件的是哪一个? A.文本框 B.单选按钮 C.组合框 D.直线控件 …

光收发器安装介绍,光纤收发器连接示意图解

对于光纤布线来讲光纤收发器都是非常熟悉的产品了&#xff0c;在光纤网络中&#xff0c;我们常常会使用到光纤收发器&#xff0c;那么&#xff0c;在网络布线过程中光纤收发器该怎么连接呢&#xff1f;接下来飞畅科技的小编就来为大家介绍下光纤收发器安装以及连接图解&#xf…

[渝粤教育] 西南科技大学 电子产品制造工艺 在线考试复习资料

电子产品制造工艺——在线考试复习资料 一、单选题 1.对放大电路进行调试,静态主要测试( )参数。 A.放大倍数 B.静态工作点 C.输入电阻 D.输出电阻 2.用万用表测量1.9k的电阻,挡位应该选择( )。 A.10k B.5k C.2k D.1k 3.对手工焊接的工艺要求描述错误的是( )。 A.焊…

变压器图案

Transformer模式是Java&#xff08;以及可能仅具有使用场所差异和不变参数类型的其他OO语言&#xff09;的设计模式&#xff0c;可帮助子类型层次结构内的对象将自己流畅地转换为任何类型的对象。 语境 我一直在关注与Jim Laskey发行的JDK-8203703相关的OpenJDK线程&#xff…

mysql 分库分表_大众点评订单系统分库分表实践

原大众点评的订单单表早就已经突破两百G&#xff0c;由于查询维度较多&#xff0c;即使加了两个从库&#xff0c;优化索引&#xff0c;仍然存在很多查询不理想的情况。去年大量抢购活动的开展&#xff0c;使数据库达到瓶颈&#xff0c;应用只能通过限速、异步队列等对其进行保护…

[渝粤教育] 西南科技大学 经济学概论 在线考试复习资料

经济学概论——在线考试复习资料 一、单选题 1.可持续发展战略的核心内容是正确处理? A.农、轻、重之间的比例关系 B.第一、二、三产业之间的比例关系 C.经济发展与人口、资源、环境之间的关系 D.积累与消费之间的比例关系 2.调整和优化产业结构就是要? A.在国民经济各部门之…

多模光纤收发器购买时需要注意什么问题?

光纤收发器是光通讯产品的一类&#xff0c;它一般应用在以太网电缆无法覆盖、必须使用光纤来延长传输距离的实际网络环境中&#xff0c;同时在帮助把光纤最后一公里线路连接到城域网和更外层的网络上也发挥了巨大的作用。现如今&#xff0c;随着光通信产业的高速发展&#xff0…

[渝粤教育] 西南科技大学 计算机网络应用基础 在线考试复习资料2021版(1)

计算机网络应用基础——在线考试复习资料2021版 一、单选题 1. 在数字通信中广泛采用CRC循环冗余码的原因是CRC可以( )。 A. 检测出一位差错 B. 检测并纠正一位差错 C. 检测出多位突发性差错 D. 检测并纠正多位突发性差错 答案:看左边查询 2.为了保证连接的可靠性,TCP通常…

[渝粤教育] 西南科技大学 高级语言程序设计(Java) 在线考试复习资料

高级语言程序设计&#xff08;Java&#xff09;——在线考试复习资料 一、单选题 1.下列哪一个包给出了Runnable接口的定义?( ) A.iava.util B.java.io C.java.lang D.java.sql 2.下列( )属于Java线程同步方法。 A.joiny( ) B.run( ) C.wait( ) D.stroy( ) 3.下列方法中可以…

cd mysql 权限不够_.bash_profile权限不够_cdmysql权限不够

mac环境下创建bash_profile文件并写入内容_IO690x477 - 118KB - JPEGmac下创建bash_profile的问题? - Mac - 知乎585x366 - 22KB - PNG如何设置bash profile格式599x366 - 38KB - JPEG如何设置bash profile格式599x366 - 38KB - JPEG.bash_profile .bashrc profile文件的作用的…

POE交换机产品如何设计防雷保护?

在POE供电系统实际应用中&#xff0c;有很多受电设备AP或移动基站的基站AP与天线&#xff0c;经常要安装于建筑物的高端点&#xff0c;因此这些受电设备也成为遭受雷击的高发点。所以&#xff0c;对于这类的数据网络中心&#xff0c;不仅要考虑建设良好的直击雷防护网与良好的接…

【渝粤教育】电大中专学前儿童科学教育 (5)作业 题库

作业视频教务托管&#xff0c;壹叁路路贰陆陆壹〇肆〇 学前儿童科学教育的学习重点是( ) A.技术的概念 B.学前儿童科学教育的内涵 C.科学的概念 D.学前儿童科学教育的概念 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2.以认识自然为目的的是&#xff08; &#…

lucene 多个分词查找_使用Lucene的新FreeTextSuggester查找长尾建议

lucene 多个分词查找Lucene的“ 建议”模块提供了许多有趣的自动建议实现&#xff0c;以便在用户将每个字符输入搜索框时为他们提供实时搜索建议。 例如&#xff0c; WFSTCompletionLookup将所有建议及其权重编译到一个紧凑的有限状态传感器中 &#xff0c;从而可以对基本建议…

【渝粤教育】电大中专幼儿园课程论 (7)作业 题库

作业视频教务托管&#xff0c;壹叁路路贰陆陆壹〇肆〇 以下哪种不是按照课程的表现形态划分的&#xff08; &#xff09; A.活动课程 B.分科课程 C.分科课程 D.显性课程 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.如果幼儿园课程的教育理念强调儿童的发…