线程池实现填充短信_填充一个池需要多少个线程?

线程池实现填充短信

在最近几个月中,我们一直看到很小但持续的操作失败,但有一个奇怪的异常– org.springframework.jdbc.CannotGetJdbcConnectionException –“无法获得JDBC连接; 嵌套异常是java.sql.SQLException:客户端尝试检出Connection的尝试已超时。 ”

我们的自然假设是,我们在C3P0连接池中存在某种争用,尝试获取连接的客户端必须等待该争用可用。 我们最好的猜测是正是这种争执导致了超时。

因此,当然,我们要做的第一件事是增加连接池中的最大连接数。 但是,无论我们将限制设置得多么高,它都无济于事。 然后,我们尝试更改连接的超时参数。 那没有产生任何更好的结果。

此时,情报已经确定下来,并且由于猜测似乎没有用,因此我们决定进行测量。 使用连接池上的一个简单包装器,我们看到即使连接池中有空闲连接,我们仍然会得到签出超时。

调查连接池开销

为了研究连接池的开销,我们执行了一个基准测试,该基准测试由6个回合组成,每个回合包括20,000个SQL操作(读/写比为1:10),使用20个线程和20个连接的连接池来执行。 使用具有20个连接的池使用20个线程意味着资源(连接)上没有争用。 因此,任何开销都是由连接池本身引起的。

我们忽略了第一次(预热)运行的结果,而取了随后5次运行的统计数据。 从这些数据中,我们收集连接签出时间,连接释放时间和总池开销。

基准项目代码可以在以下位置找到: https : //github.com/yoavaa/connection-pool-benchmark

我们测试了3个不同的连接池:

  • C3P0 – com.mchange:c3p0:0.9.5-pre3 – C3P0DataSourceBenchmark类
  • Bone CP – com.jolbox:bonecp:0.8.0-rc1 –类BoneDataSourceBenchmark
  • Apache DBCP – commons-dbcp:commons-dbcp:1.4 –类DbcpDataSourceBenchmark

(在该项目中,还有一个我自己的实验性异步池的基准测试-https: //github.com/yoavaa/async-connection-pool 。但是,出于本文的目的,我将忽略它)。

为了自己运行基准测试,您应该使用下表设置MySQL

CREATE TABLE item (file_name     varchar(100) NOT NULL,user_guid     varchar(50) NOT NULL,media_type    varchar(16) NOT NULL,date_created  datetime NOT NULL,date_updated  timestamp AUTO_INCREMENT NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(file_name)
)

然后更新Credentials对象以指向此MySQL安装。

运行基准测试时,结果示例如下:

run, param, total time, errors, under 1000 nSec,1000 nSec - 3200 nSec,3200 nSec - 10 µSec,10 µSec - 32 µSec,32 µSec - 100 µSec,100 µSec - 320 µSec,320 µSec - 1000 µSec,1000 µSec - 3200 µSec,3200 µSec - 10 mSec,10 mSec - 32 mSec,32 mSec - 100 mSec,100 mSec - 320 mSec,320 mSec - 1000 mSec,1000 mSec - 3200 mSec,other
0, acquire,29587,0,0,5,1625,8132,738,660,1332,1787,2062,2048,1430,181,0,0,0
0, execution, , ,0,0,0,0,0,0,0,1848,6566,6456,5078,52,0,0,0
0, release, , ,0,8,6416,9848,3110,68,77,115,124,148,75,11,0,0,0
0, overhead, , ,0,0,49,4573,5459,711,1399,1812,2142,2157,1498,200,0,0,0
1, acquire,27941,0,0,125,8153,499,658,829,1588,2255,2470,2377,1013,33,0,0,0
1, execution, , ,0,0,0,0,0,0,6,1730,6105,6768,5368,23,0,0,0
1, release, , ,0,49,15722,3733,55,42,69,91,123,101,14,1,0,0,0
1, overhead, , ,0,0,2497,5819,869,830,1610,2303,2545,2448,1042,37,0,0,0

此信息已导入Excel文件(也包含在基准项目中)以进行分析。

C3P0

最初在C3P0中,我们在生产环境中看到了原始异常。 让我们看看它如何执行:

阅读图表:

前三个图表(获取,发布,开销)是基于性能的存储桶图表。 Y轴表示在一定时间范围内完成的操作数(在X轴上显示)。 默认的经验法则是,左侧的条形越高,效果越好。 第四图表是瀑布图,其中每个水平线表示一个DB操作。 棕色表示等待获取连接的时间,绿色表示执行数据库操作的时间,蓝色表示将连接返回到连接池的时间。

从图表中可以看出,通常,C3P0在3.2-10微秒内获得连接,并在3.2-10微秒内释放连接。 那绝对是一些令人印象深刻的表现。 但是,C3P0在约3.2-32毫秒处还有另一个峰值,而长尾巴则高达320-1000毫秒。 正是第二个高峰导致了我们的例外。

C3P0怎么了? 是什么原因导致了这种极小但相当大的超长操作百分比,而大多数时候却表现惊人? 纵观4 图可以为我们指出了答案的方向。

第4 图表从左上角到右下角都有一条清晰的对角线,表明总体上,连接获取是按顺序开始的。 但是我们可以识别出一些奇怪的东西–我们可以看到棕色的三角形,表示当多个线程试图获取连接时,第一个线程比后续线程等待更多时间的情况。 这转化为用于获取连接的两个性能“组”。 一些线程极其快速地获得连接,而有些线程则饿死等待连接,而较后的线程的请求则得到了较早的答复。

早期线程比后续线程等待更长的时间的这种行为意味着不公平的同步。 事实上,挖掘到C3P0代码时,我们已经看到了收购的连接的过程中,C3P0使用“ 同步 ”关键字三次。 在Java中,' synceded '关键字创建了不公平的锁,这可能导致线程饥饿。

稍后我们可能会尝试使用公平锁定来修补C3P0。 如果这样做,我们自然会分享我们的发现。

此基准测试的C3P0配置:

  • 最小泳池大小:20
  • 初始池大小:20
  • 游泳池的最大大小:20
  • 采集增量:10
  • 辅助线程数:6

骨CP

我们在Wix上尝试了BoneCP,但结果不一,因此目前尚不确定我们是否喜欢它。 尽管分析并不全面,但我们将BoneCP基准测试的结果包括在这些帖子中。

查看图表,我们可以看到Bone的连接捕获性能非常出色–大多数操作在3.2微秒内完成,比C3P0快得多。 但是,我们还观察到连接释放时间很长,大约1-10毫秒,太高了。 我们还观察到Bone的操作很长,开销高达320毫秒。

从数据来看,在正常和“极端”情况下,BoneCP似乎都比C3P0好。 但是,如图表所示,差异并不大。 查看第4 图表,我们看到与C3P0相比,褐色较少(因为连接获取更好),但出现了蓝线,表明线程等待连接释放的时间。

如上所述,由于我们对使用BoneCP充其量是矛盾的,因此我们没有投入大量资源来分析此连接池的性能问题。

Apache DBCP

Apache DBCP被称为古老的数据源。 让我们看看与其他两个相比的情况如何。

显而易见的是– DBCP性能优于C3P0和Bone。 在所有方面,无论是在连接签出时间,连接释放时间还是瀑布图形式方面,它都优于其他方法。

那么您应该使用什么数据源?

好吧,这是一个不平凡的问题。 显然,就连接池性能而言,我们显然是赢家– DBCP。 似乎C3P0应该很容易修复,我们可以尝试一下。

但是,重要的是要记住,此研究的范围仅限于实际连接获取/释放的性能。 实际的数据源选择是一个更复杂的问题。 例如,该基准测试忽略了一些重要方面,例如池的增长和缩小,网络错误的处理,数据库故障时的故障转移等等。

参考: 填充一个池需要多少个线程? 来自我们的JCG合作伙伴 Yoav Abrahami,来自Wix IO博客。

翻译自: https://www.javacodegeeks.com/2013/06/how-many-threads-does-it-take-to-fill-a-pool.html

线程池实现填充短信

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

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

相关文章

jsf标签_多个动态包含一个JSF标签

jsf标签每个JSF开发人员都知道ui&#xff1a;include和ui&#xff1a;param标签。 您可以包括一个facelet&#xff08;XHTML文件&#xff09;并传递一个对象&#xff0c;该对象将在包含的facelet中可用&#xff0c;如下所示&#xff1a; <ui:include src"/sections/co…

spring 长轮询_Spring集成文件轮询和测试

spring 长轮询我最近实施了一个小项目&#xff0c;在该项目中&#xff0c;我们必须轮询文件夹中的新文件&#xff0c;然后在文件内容上触发服务流。 Spring Integration非常适合此要求&#xff0c;因为它带有一个通道适配器 &#xff0c;该适配器可以扫描文件夹中的新文件&…

您将在下一个项目中使用JSF吗?

上周有一篇很棒的stackoverflow博客文章&#xff0c;主题是“ JavaScript框架的残酷生命周期” 。 这篇文章是关于Javascript UI框架&#xff08;angularjs&#xff0c;angular&#xff0c;jquery和react&#xff09;的流行和流行的速度。 这篇文章的关键指标是每月关于框架的问…

使用java自带的日志管理_java日志管理

1.相关概念日志统一框架(日志门面)&#xff1a;apache commons logging、slf4j日志实现框架(实现层)&#xff1a;JDK自带的logging(java.util.logging)、log4j、Java Util Logging、log4j2、logback.(1)JDK自带的logging(java.util.logging)用法&#xff1a;1 importjava.util.…

安卓4.4玩java_Android4.4运行过程中闪退java.lang.NoClassDefFoundError

上周五项目测试时发现一个奇怪的Bug&#xff0c;项目中依赖了一个第三方框架&#xff0c;但是在android4.0-4.4.4之间的系统中运行会直接闪退&#xff0c;抛出错误异常为java.lang.NoClassDefFoundError。第一次遇到这样的问题&#xff0c;google了好久找到了以下几个原因&…

update se_Java SE 7 Update 25 –发行说明进行了解释。

update se昨天是CPU日。 Oracle通过6月的Java重要补丁更新发布了Java SE更新25 。 在4月的最后一次重大更新之后&#xff0c;这是最后一次与Oracle其他所有Oracle产品都不适合的Oracle重要补丁更新计划。 从2013年10月开始 &#xff0c;Java安全修补程序将遵循四个年度安全发布…

java scavenge_请概述一下Java中都有哪些垃圾收集器

1、Serial(串行GC)收集器Serial收集器是一个新生代收集器&#xff0c;单线程执行&#xff0c;使用复制算法。它在进行垃圾收集时&#xff0c;必须暂停其他所有的工作线程(用户线程)。是Jvmclient模式下默认的新生代收集器。对于限定单个CPU的环境来说&#xff0c;Serial收集器由…

阿帕奇光束

Apache Beam是一个开放源代码统一模型&#xff0c;用于定义批处理和流数据并行处理管道。 使用一种开源的Beam SDK&#xff0c;您可以构建一个定义管道的程序。 然后&#xff0c;该管道由Beam支持的分布式处理后端之一执行&#xff0c;这些后端包括Apache Apex &#xff0c; Ap…

java音乐登陆界面_第四篇——Spring音乐登录界面设计及实现(C#)

Spring音乐播放器&#xff0c;我们小组设计其启动时有一个登录界面&#xff0c;用户初次可以注册&#xff0c;输入用户名和密码&#xff0c;点击注册即将输入信息保存到register文本文件中&#xff1b;如果已有用户名&#xff0c;输入用户名和密码&#xff0c;点击登录&#xf…

java中线性结构的例子_java数据结构--线性结构

一、数据结构数据结构由数据和结构两部分组成&#xff0c;就是将数据按照一定的结构组合起来&#xff0c;这样不同的组合方式有不同的效率&#xff0c;可根据需求选择不同的结构应用在相应在场景。数据结构大致分为两类&#xff1a;线性结构(如数组&#xff0c;链表&#xff0c…

Spring Boot和JSP

本指南展示了如何使用Spring Boot通过JSP创建MVC Web应用程序。 先决条件&#xff1a; Eclipse IDE&#xff08;最新版本&#xff09; Maven的4 Java 1.8 1.创建Maven Web项目 打开eclipse&#xff0c;然后创建一个新的Maven Web项目&#xff0c;并将其命名为SpringBootWe…

判断用户名和密码是否正确java_facebook中如何判断用户名和密码是否正确

Do you hear the angel?Do you think that this really has the angel in the world?We knew from the story in the book, the angel contain the wing of the beauty, beautiful face , the mind of the docile, generous breadth of view, they would like to sacrifice t…

使用Spock测试您的代码

Spock是针对Java和Groovy应用程序的测试和规范框架。 Spock是&#xff1a; 极富表现力 促进测试的给定/何时/然后语法 与大多数IDE和CI服务器兼容。 听起来不错&#xff1f; 通过快速访问Spock Web控制台&#xff0c;您可以非常快速地开始使用Spock。 当您有一个喜欢的小测…

php删除文见,php如何删除文件夹

php删除文件夹的方法&#xff1a;首先创建一个PHP示例文件&#xff1b;然后通过“function deldir($dir) {...}”删除目录下的文件并删除当前文件夹即可。php删除文件夹及其文件夹下所有文件function deldir($dir) {//先删除目录下的文件&#xff1a;$dhopendir($dir);while ($…

阿帕奇齿轮泵

Apache Gearpump是实时大数据流引擎。 它从2014年中期开始就在Intel上作为GitHub上的开源项目构想的&#xff0c;并于2016年3月8日进入Apache孵化。Gearpump的名称是对工程术语“齿轮泵”的指称&#xff0c;它是一个超级简单的泵&#xff0c;由只有两个齿轮&#xff0c;但是在流…

php网站标签加小图标,在htmltitle/title标签添加图标,网页title左边显示网页的logo图标...

如图在黑色所画圆之中显示一个图标&#xff1a;步骤一&#xff1a;在图片中显示图标&#xff0c;这里的图片只支持ico格式&#xff0c;需要转换图片格式.原始图像可以接受: .jpg .jpeg .gif .png等图像格式在这个网址http://www.php.cn/上传你的原始图片然后生成ico格式图标(百…

在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例

使用Jackson API在Java中解析JSON时的常见问题之一是&#xff0c;当您的JSON包含未知属性&#xff08;即您的Java类没有对应于所有JSON属性的所有字段&#xff09;时&#xff0c;该操作将失败。 例如&#xff0c;如果您正在使用REST Web服务中的JSON&#xff0c;并且明天他们在…

php界面设置编码格式,php设置编码格式的方法

php设置编码格式的方法发布时间&#xff1a;2020-08-15 11:02:56来源&#xff1a;亿速云阅读&#xff1a;78作者&#xff1a;小新这篇文章主要介绍php设置编码格式的方法&#xff0c;文中介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们一定要看完&…

单元测试 问题描述_单元测试技巧:创建描述性测试

单元测试 问题描述您的单元测试应尽可能具有描述性。 他们给您的反馈应该非常清楚&#xff0c;您甚至不必启动调试器&#xff0c;并一步一步地检查代码以检查局部变量。 为什么&#xff1f; 因为那需要时间&#xff0c;而且我们很懒&#xff0c;对吗&#xff1f; 为此&#xff…

matlab小波脊线,小波脊线提取,模极大值法。运行的结果不太对,代码有些地方我也没完全看懂...

本帖最后由 1393107100 于 2019-5-1 11:10 编辑clear,clcclose all%%%%%% 小波变换 %%%%%%%%%%%%%%%%fs1024;t1/fs:1/fs:1;f1100;f2200;f3300;scos(2*pi*f1*t.*(t>0&t<0.3))2*cos(2*pi*f2*t.*(t>0.3&t<0.8))3*sin(2*pi*f3*t.*(t>0.8&t<1));%sc…