android wtf_WTF连接池

android 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

android wtf

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

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

相关文章

c语言实验5上机刘若慧2017年,《《 C语言程序设计案例教程》》.ppt

《《 C语言程序设计案例教程》》.ppt课堂练习&#xff1a; 7、求三个整数之和&#xff1a; 1 只用main函数 2 用求两个整数之和的函数实现 main int a, b, c, sum; scanf “%d, %d,%d”, &a, &b, &c &#xff1b; sum abc; printf “sum %d\n”,sum ; printf “%d%…

c++ vs 输出log到窗口_欧冠豪门碰撞,尤文vs巴萨,曼联vs红牛

点击上方蓝色字关注我们 “ 欧冠第二轮昨日完成8场比赛&#xff0c;3胜3平2负&#xff0c;各队保平争胜策略明显。今日各豪门再出发&#xff0c;竞彩推出4场热门比赛。热门014尤文vs巴萨&#xff0c;015曼联vs莱比锡红牛。”01—周三014 欧冠 尤文图斯vs巴塞罗那 2020-10-29 04…

Servlet中判断浏览器版本的代码

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取user-agent&#xff0c;判断浏览器版本** author liaowenxiong* date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.htt…

jakarta ee_在等待Jakarta EE时

jakarta ee自Oracle在JavaOne 2017宣布将Java™EE转移到Eclipse Foundation以来已有一年多了。此后&#xff0c;发生了很多事情&#xff1a; Java™EE 8 API和实现项目已在EE4J下建立 。 Eclipse GlassFish 5.1 即将发布 。 全新的Jakarta EE规范流程指日可待。 社区显示出…

c语言解析分隔符文本,c – 使用分隔符读取文件

正如其他两个答案所指出的那样,你必须使用std :: getline,但这就是我要做的&#xff1a;if (std::getline(is, zipcode, ,) &&std::getline(is, city, ,) &&std::getline(is, state)){d.zipCode std::stoi(zipcode);}我做的唯一真正的改变是我将提取包含在if语…

很高兴加入 英文_XR车载公司Holoride加入高通XR计划

原标题&#xff1a;XR车载公司Holoride加入高通XR计划XR车载公司Holoride进来了高通的Qualcomm XR Eneerprise决策 你大约没有听说过holoride&#xff0c;但你势必听说过高通公司。下面我们就来看看Holoride&#xff0c;他是一家确立两年的XR车载公司&#xff0c;起劲于提供家用…

Servlet中获取请求体的数据

package priv.lwx.javaex.servlet_demo.web.servlet.request;/*** 获取请求体的数据** author liaowenxiong* date 2021/12/29 11:21*/import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import ja…

go语言var 和make_Var和语言设计

go语言var 和makeJava中的var是什么 在Java 10中引入的var预定义类型使您可以在为变量分配值时声明局部变量&#xff0c;而无需指定变量的类型。 当给变量赋值时&#xff0c;表达式的类型已经定义了变量的类型&#xff0c;因此没有理由在行的左侧再次键入类型。 例如&#xff0…

c语言每次堆的变化是1k,DSPXC语言+程序烧写讲述.ppt

DSPXC语言程序烧写讲述* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 第2.5节 DSP程序烧写 第2.5节 DSP程序烧写 第2.5节 DSP程序烧写 注意事项: 电路元件初始化同步问题&#xff1a;由于外…

众智日照分析软件_飞时达CAD日照分析计算软件FastSUN V14.0.1发布升级

2020-7-13&#xff0c;正式对外发布飞时达日照分析软件FastSUN V14.0.1(32/64)&#xff0c;本次为小版本升级发布。温馨提醒&#xff1a;本次升级以安装包更新的方式发行&#xff0c;原14.0版本不需要卸载可直接覆盖安装本更新安装包14.0.1。飞时达日照分析软件FastSUN V14.0.1…

高频变压器_变压器图案

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

linux文件 run.man,【Linux】linux经常使用基本命令

Linux中很多经常使用命令是必须掌握的&#xff0c;这里将我学linux入门时学的一些经常使用的基本命令分享给大家一下&#xff0c;希望能够帮助你们。这个是我将鸟哥书上的进行了一下整理的&#xff0c;希望不要涉及到版权问题。1、显示日期的指令&#xff1a; date2、显示日历的…

guid会重复吗_知网查重会查重表格吗

知网查重会查重表格吗&#xff1f;答案是肯定的。如果出现知网查重表格重复很高&#xff0c;那么我们一样是会进行避免查重的&#xff0c;通常表格在查重后会在报告中展示&#xff0c;如果出现重复会提示大家&#xff0c;我们只需要根据这个提示进行修改降低表格查重率即可。那…

stripe pay_J2Pay –简介

stripe pay介绍 J2Pay是用于Java的开源多网关支付库&#xff08;由tranxactive提供&#xff09;。 该库的主要目的是为多个网关同时提供简单而通用的请求/响应&#xff0c;它也排除了网关文档的阅读。 如果您尝试在网关上工作&#xff0c;则不必阅读文档&#xff0c;因为该库具…

windows远程桌面_如何使用Windows远程桌面连接Ubuntu 干货

近期网盾科技给大家分享了一些教程类的干货&#xff0c;有很多小伙伴都收藏了网盾科技的文章&#xff0c;能对大家有帮助就好。今天网盾科技再给小伙伴们讲解一下如何使用Windows远程桌面连接Ubuntu&#xff0c;干货收藏&#xff01; Windows连接已有界面的Linux 看了许多教程都…

android 单元测试 多线程,单元测试多线程Android RxJava

您可以编写自己的ThreadFactoryThreadFactory custom new CustomThreadFactory();ExecutorService executorService Executors.newCachedThreadPool(custom); //or use newSingleThreadExecutor(..)Scheduler customScheduler Schedulers.from(executorService); 现在你可以…

Servlet中获取文件在服务器主机的真实路径

package priv.lwx.javaex.servlet_demo.web.servletcontext; /*** 获取文件在服务器主机的真实路径** author liaowenxiong* date 2022/1/12 15:34*/import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet…

wxpay-api:pay_J2Pay – API响应

wxpay-api:pay介绍 该库中的神奇之处在于&#xff0c;无论网关是什么&#xff0c;其响应都是唯一的。 了解API响应后&#xff0c;您便可以轻松地将此响应用于进一步的交易&#xff0c;例如退款&#xff0c;作废或重新开票。 首先&#xff0c;在开始阅读时&#xff0c;所有响应…

Android设置toolbar高度,Android基础知识之 Toolbar 的使用

Toolbar是Android5.0推出的,用来替代ActionBar的控件.可以高度的自定义,使用灵活.官方的ToolBar是必须在5.0以上的系统才能使用,如果需要在低版本中使用.需要使用support v7包中的Toolbar.下一是官网的Toolbar的介绍:Toolbarextends ViewGroupjava.lang.Object↳ android.view.…

delphi 停电文本数据丢失_概述DCS系统正确停电和上电的步骤

欢迎关注“热控圈 ” ID&#xff1a;rekongquan传播热控知识&#xff0c;分享技术精华&#xff01;如何由入门到精通学会西门子PLC系统&#xff1f;扫码关注“电力工程学”&#xff0c;系列视频正在播出&#xff01;在因大修或者其他原因需要对DCS进行断电维护时&#xff0c;我…