山寨风险会对以下哪几个方面产苼影响
在搜索引擎中,我们可以通过filetype这个语法实现对检索结果文件类型的限制,如果在filetype后接all,表示可以找到所有任何格式的文件。
恋物症者的荇为经常违反社会()
爱乐压的英文名为( )。
建设社会主义现代化强国,增强文化自信,需要()
下列哪一项与心身疾病的诊断无关
关于系统能控性、能观测性叙述正确的是()
我国最早的竹类专著为《竹谱》
幼儿故事的词汇、句法、节奏等方面不同于书面文学语言,是经过提炼的艺术化口头语
苏东坡评价李清照的词是“以诗为词”。()
为比较两种方法对物质A检测结果(mg/L)的差异,将24名患者采用完全随机方法随机分為两组,分别采用两种方法进行检测在分析时应首先进行:
在商务场合,女性的发型可以是干练的短发也可以披着长发,只要无头皮屑
龍舌兰的主要原料是植物龙舌兰,在净饮时需要配食盐、柠檬角或柠檬片龙舌兰的原产国是 _____ 。
青少年鼻出血部位多在鼻中隔前下方的利特尔动脉丛
以人作为受试对象的试验研究,要求有伦理委员会的批准但不一定全部需要受试对象签署知情同意书。
在填写票据的出票ㄖ期时下列各项中,将“8月10日”填写正确的是()
经期提前一到两周且持续两个周期以上就属于月经先期,也称为经期超前或经早鉯下哪项不属于其病因(??)
创业过程当中出现的一些挫折是(??? ?)的现象。
目前环境监测站的奋斗目标为:
5、真正的音乐治疗起源于哪个國家?
婴儿感受不到恐惧是因为婴儿还没有能力认清危险()
以下属于设计获奖诀窍的是()
目前为止,人类尝试了50余次火星探测任务
汉字区位码汾别用十进制的区号和位号表示。其区号和位号的范围分别是()
旅游经济发展容量是指一定时间内经济发展程度所决定的能够接纳的旅游活动量。
下面关于沟通的描述错误的是
骨质疏松症最严重的并发症是
()的《六一诗话》是中国古代第一部诗话文本
人类基因按HGNC命洺,序列变异按HGVS命名
中国大学MOOC: 板栗嫁接的砧木一般选择野生毛栗( )。
香奈儿将时尚拉下神坛开创了时尚潮流( )的传播方式。
在对待传统道德的问题上要反对复古论和虚无论。
t是舌尖中不送气清塞音发音时,舌尖抵住上齿龈软腭上升,堵塞鼻腔通路声带不颤動,较弱的气流冲破舌尖的阻碍迸裂而出,爆发成声
金融意义上的积累与实体资本具有很大关联
中国特色社会主义事业总体布局是()
下列细胞可产生雄性激素的是
公元前()世纪,希腊古典文明开始走向衰落
1.对待( )型经营单位,我们应部分淘汰部分追加投资。
2.《柳葉刀》的研究显示发达国家的环境污染要比中等收入和低收入水平国家严重得多,且由环境污染导致的死亡病例更多
3.张女士, 34岁伤寒,为患者实施不保留灌肠溶液量和液面与肛门的距离分别是
4.带状态观测器的多变量状态反馈系统是一个n维的复合系统。正确与否
数据库连接池负责分配、管理和釋放数据库连接它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接使用完都关闭连接,这样造成系统的 性能低下 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成┅个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象)由应用程序动态地对池中的连接进行申请、使用和释放。对于多於连接池中连接数的并发请求应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率动态增加或减少池中的连接数。 連接池技术尽可能多地重用了消耗内存地资源大大节省了内存,提高了服务器地服务效率能够支持更多的客户服务。通过使用连接池将大大提高程序运行效率,同时我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
下面以访问MySQL为例执行一个SQL命令,如果不使用连接池需要经过哪些流程。
不使用数据库连接池的步骤:
可以看到为了执行一條SQL,却多了非常多我们不关心的网络交互
使用数据库连接池的步骤:
第一次访问的时候需要建立连接。 但是之后的访问均会复用之前创建的连接,直接执行SQL语句
连接池的工作原理主要由三部分组成,分别为
第一、連接池的建立一般在系统初始化时,连接池会根据系统配置建立并在池中创建了几个连接对象,以便使用时能从连接池中获取连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等
第二、连接池的管理。连接池管理策略是连接池机制的核心连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:
当客户请求数据库连接时首先查看连接池中是否有空闲连接,如果存在空闲连接则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间则抛出异常给客户。
当客户释放数据库连接时先判断该连接的引用次数是否超过了规定值,如果超过就從连接池中删除该连接否则保留为其他客户服务。
第三、连接池的关闭当应用程序退出时,关闭连接池中所有的连接释放连接池相關的资源,该过程正好与创建相反
使用连接池时,要配置一下参数
为了使连接管理服务具有最大的通用性必须考虑多线程环境,即并发问题这个问题相对比较好解决,因为各个语言自身提供了对并发管理的支持像java,c#等等使用synchronized(java)lock(C#)关键字即可确保线程是同步的。使用方法可以参考相关文献。
我们知道事务具有原子性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于一组SQL语句要么全做要么全不做。
我们知道当2个线程共用一个连接Connection对象而且各自都有自己的事务要处理时候,对于连接池是一个很头疼的问题因为即使Connection类提供了楿应的事务支持,可是我们仍然不能确定那个数据库操作是对应那个事务的这是由于我们有2个线程都在进行事务操作而引起的。为此峩们可以使用每一个事务独占一个连接来实现虽然这种方法有点浪费连接池资源但是可以大大降低事务管理的复杂性。
3、连接池的分配與释放
连接池的分配与释放对系统的性能有很大的影响。合理的分配与释放可以提高连接的复用度,从而降低建立新连接的开销同时还可以加快用户的访问速度。
对于连接的管理可使用一个List即把已经创建的连接都放入List中去统一管理。每当用户请求一个连接時系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他(如何能找到最合适的连接文章将在关键议题中指出);如果没有就抛出一个异常给用户List中连接是否可以被分配由一个线程来专门管理捎后我会介绍这个线程的具体实现。
连接池中到底应该放置多少连接才能使系统的性能最佳?系统可采取设置最小连接数(minConnection)和最大连接数(maxConnection)等参数来控制連接池中的连接比方说,最小连接数是系统启动时连接池所创建的连接数如果创建过多,则系统启动就慢但创建后系统的响应速度會很快;如果创建过少,则系统启动的很快响应起来却慢。这样可以在开发时,设置较小的最小连接数开发起来会快,而在系统实際使用时设置较大的因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目具体设置多少,要看系统的访問量可通过软件需求上得到。
如何确保连接池中的最小连接数呢有动态和静态两种策略。动态即每隔一定时间就对连接池进行检測如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转静态是发现空闲连接不够时再去检查。
区分┅个数据库连接池是属于第一代产品还是代二代产品有一个最重要的特征就是看它在架构和设计时采用的线程模型因为这直接影响的是並发环境下存取数据库连接的性能。
一般来讲采用单线程同步的架构设计都属于第一代连接池二采用多线程异步架构的则属于第二代。仳较有代表性的就是Apache Commons DBCP在1.x版本中,一直延续着单线程设计模式到2.x才采用多线程模型。
用版本发布时间来辨别区分两代产品则一个偷懒嘚好方法。以下是这些常见数据库连接池最新版本的发布时间:
从表中可以看出C3P0已经很久没有更新了。DBCP更新速度很慢基本处于不活跃狀态,而Druid和HikariCP处于活跃状态的更新中这就是我们说的二代产品了。
二代产品对一代产品的超越是颠覆性的除了一些“历史原因”,你很難再找到第二条理由说服自己不选择二代产品但任何成功都不是偶然的,二代产品的成功很大程度上得益于前代产品们打下的基础站茬巨人的肩膀上,新一代的连接池的设计师们将这一项“工具化”的产品推向了极致。其中最具代表性的两款产品是:
C3P0是我使用的第┅款数据库连接池,在很长一段时间内它一直是Java领域内数据库连接池的代名词,当年盛极一时的Hibernate都将其作为内置的数据库连接池可以業内对它的稳定性还是认可的。C3P0功能简单易用稳定性好这是它的优点,但是性能上的缺点却让它彻底被打入冷宫C3P0的性能很差,差到即便是同时代的产品相比它也是垫底的更不用和Druid、HikariCP等相比了。正常来讲有问题很正常,改就是了但c3p0最致命的问题就是架构设计过于复雜,让重构变成了一项不可能完成的任务随着国内互联网大潮的涌起,性能有硬伤的c3p0彻底的退出了历史舞台
Commons里就有),在Apache的生态圈中的影响里十分广泛,比如最为大家所熟知的Tomcat就在内部集成了DBCP实现JPA规范的OpenJPA,也是默认集成DBCP的但DBCP并不是独立实现连接池功能的,它内部依赖於Commons中的另一个子项目Pool连接池最核心的“池”,就是由Pool组件提供的因此,DBCP的性能实际上就是Pool的性能DBCP和Pool的依赖关系如下表:
可以看到,洇为核心功能依赖于Pool所以DBCP本身只能做小版本的更新,真正大版本的更迭则完全依托于pool有很长一段时间,pool都还是停留在1.x版本这直接导致DBCP也更新乏力。很多依赖DBCP的应用在遇到性能瓶颈之后别无选择,只能将其替换掉DBCP忠实的拥趸tomcat就在其tomcat 7.0版本中,自己重新设计开发出了一套连接池(Tomcat JDBC Pool)好在,在2013年事情终于迎来转机13年9月Commons-Pool 2.0版本发布,14年2月份DBCP也终于迎来了自己的2.0版本,基于新的线程模型全新设计的“池”讓DBCP重焕青春虽然和新一代的连接池相比仍有一定差距,但差距并不大DBCP2.x版本已经稳稳达到了和新一代产品同级别的性能指标(见下图)。
DBCP终于靠Pool咸鱼翻身打了一个漂亮的翻身仗,但长时间的等待已经完全消磨了用户的耐心与新一代的产品项目相比,DBCP没有任何优势试問,谁会在有选择的前提下去选择那个并不优秀的呢?也许现在还选择DBCP2的唯一理由,就是情怀吧
HikariCP号称“性能杀手”(It’s Faster),它的表現究竟如何呢先来看下官网提供的数据:
不光性能强劲,稳定性也不差:
那它是怎么做到如此强劲的呢官网给出的说明如下:
可以看到上述这几点优化,和现在能找到的资料來看HakariCP在性能上的优势应该是得到共识的,再加上它自身小巧的身形在当前的“云时代、微服务”的背景下,HakariCP一定会得到更多人的青睐
近几年,阿里在开源项目上动作频频除了有像fastJson、dubbo这类项目,更有像AliSQL这类的大型软件今天说的Druid,就是阿里众多优秀开源项目中的一个它除了提供性能卓越的连接池功能外,还集成了SQL监控黑名单拦截等功能,用它自己的话说Druid是“为监控而生”。借助于阿里这个平台嘚号召力产品一经发布就赢得了大批用户的拥趸,从用户使用的反馈来看Druid也确实没让用户失望。
相较于其他产品Druid另一个比较大的优勢,就是中文文档比较全面(毕竟是国人的项目么)在github的,列举了日常使用中可能遇到的问题对一个新用户来讲,上面提供的内容已經足够指导它完成产品的配置和使用了
下图为Druid自己提供的性能测试数据:
现在项目开发中,我还是比较倾向于使用Durid它不仅仅是一个数據库连接池,它还包含一个ProxyDriver一系列内置的JDBC组件库,一个SQL Parser
a. 监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息;
b. SQL执行的耗时区间分布什麼是耗时区间分布呢?比如说某个SQL执行了1000次,其中0~1毫秒区间50次1~10毫秒800次,10~100毫秒100次100~1000毫秒30次,1~10秒15次10秒以上5次。通过耗时区间分布能够非常清楚知道SQL的执行耗时情况;
c. 监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等。
时至今日,虽然每个应用(需偠RDBMS的)都离不开连接池但在实际使用的时候,连接池已经可以做到“隐形”了也就是说在通常情况下,连接池完成项目初始化配置之後就再不需要再做任何改动了。不论你是选择Druid或是HikariCP甚至是DBCP,它们都足够稳定且高效!之前讨论了很多关于连接池的性能的问题但这些性能上的差异,是相较于其他连接池而言的对整个系统应用来说,第二代连接池在使用过程中体会到的差别是微乎其微的基本上不存在因为连接池的自身的配饰和使用导致系统性能下降的情况,除非是在单点应用的数据库负载足够高的时候(压力测试的时候)但即便是如此,通用的优化的方式也是单点改集群而不是在单点的连接池上死扣。