数据库连接池——基本原理
数据库连接池——基本原理
1.数据库连接池是什么?
数据库连接池是负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个。
2.为什么要使⽤连接池?
数据库连接是⼀种关键的有限的昂贵的资源,这⼀点在多⽤户的⽹页应⽤程序中体现得尤为突出。 ⼀个数据库连接对象均对应⼀个物理数据库连接,每次操作都打开⼀个物理连接,使⽤完都关闭连接,这样造成系统的性能低下。
3.连接池的设计思想:
在应⽤程序启动时建⽴⾜够的数据库连接,并将这些连接组成⼀个连接池。(换句话说:在⼀个“池”⾥放了好多半成品的数据库连接对象)。
由应⽤程序动态地对池中的连接进⾏申请、使⽤和释放。
对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。
并且应⽤程序可以根据池中连接的使⽤率,动态增加或减少池中的连接数。
3.3使⽤了连接池的好处:
1. 连接池技术尽可能多地重⽤了消耗内存地资源,⼤⼤节省了内存,提⾼了服务器地服务效率,能够⽀持更多的客户服务。
2. 通过使⽤连接池,将⼤⼤提⾼程序运⾏效率,同时,我们可以通过其⾃⾝的管理机制来监视数据库连接的数量、使⽤情况等。
2 传统的连接机制 vs 数据库连接池的运⾏机制
传统的:
步骤
1. TCP 建⽴连接三次握⼿
2. MySql 认证的三次握⼿
3. SQL 的执⾏
4. MySql 的关闭
5. TCP 的四次握⼿关闭
可以看出:⼀条SQL语句的执⾏,其实包含了多次的⽹络交互。优点
实现简单
缺点
1. ⽹络IO较多
2. 数据库的负载较⾼
3. 响应时间较长及QPS较低  (QPS:每秒查询率)
4. 应⽤频繁的创建连接和关闭连接,导致临时对象较多,GC频繁(java 的垃圾回收⽅法)
druid连接池配置详解5. 在关闭连接后,会出现⼤量TIME_WAIT 的TCP状态(在2个MSL之后关闭)
连接池的:
准备好若⼲的连接 ,数据源完成连接池的管理,(多线程)
步骤:
第⼀次访问的时候,需要建⽴连接。但是之后的访问,均会复⽤之前创建的连接,直接执⾏SQL语句。上下两个灰⾊部分的每次只执⾏⼀次
黄⾊部分的执⾏多次SQL。
优点
1. 减少了⽹络开销
2. 系统的性能会有⼀个实质的提升
3. 没了⿇烦的TIME_WAIT状态
3.数据库连接池——⼯作原理
3.1 连接池的建⽴
⼀般在系统初始化时,连接池会根据系统配置建⽴,并在池中创建了⼏个连接对象,以便使⽤时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建⽴和关闭造成的系统开销。
Java中提供了很多容器类可以⽅便的构建连接池,例如Vector、Stack等。
3.2 连接的管理
连接池管理策略是连接池机制的核⼼,连接池内连接的分配和释放对系统的性能有很⼤的影响。其管
理策略是:
当客户请求数据库连接时,⾸先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使⽤;如果没有空闲连接,则查看当前所开的连接数是否已经达到最⼤连接数,如果没达到就重新创建⼀个连接给请求的客户;如果达到就按设定的最⼤等待时间进⾏等待,如果超出最⼤等待时间,则抛出异常给客户。
当客户释放数据库连接时,先判断该连接的引⽤次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。
该策略保证了数据库连接的有效复⽤,避免频繁的建⽴、释放连接所带来的系统资源开销。
3.3 连接池的关闭
当应⽤程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。
4.注意点
1. 并发问题
2. 事务处理
3. 连接池的分配与释放
4. 连接池的配置与维护
1、并发问题
为了使连接管理服务具有最⼤的通⽤性,必须考虑多线程环境,即并发问题。
这个问题相对⽐较好解决,因为各个语⾔⾃⾝提供了对并发管理的⽀持像java,c#等等,使⽤synchronized(java)lock(C#)关键字即可确保线程是同步的。
2、事务处理
我们知道,事务具有原⼦性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于⼀组SQL语句要么全做,要么全不做。
我们知道当2个线程共⽤⼀个连接Connection对象,⽽且各⾃都有⾃⼰的事务要处理时候,对于连接池是⼀个很头疼的问题,因为即使Connection类提供了相应的事务⽀持,可是我们仍然不能确定那个数据库操作是对应那个事务的,这是由于我们有2个线程都在进⾏事务操作⽽引起的。
为此我们可以使⽤每⼀个事务独占⼀个连接来实现,虽然这种⽅法有点浪费连接池资源但是可以⼤⼤降低事务管理的复杂性。
3、连接池的分配与释放
连接池的分配与释放,对系统的性能有很⼤的影响。合理的分配与释放,可以提⾼连接的复⽤度,从⽽降低建⽴新连接的开销,同时还可以加快⽤户的访问速度。
对于连接的管理可使⽤⼀个List。即把已经创建的连接都放⼊List中去统⼀管理。每当⽤户请求⼀个连接时,系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他,如果没有就抛出⼀个异常给⽤户。
4、连接池的配置与维护
连接池中到底应该放置多少连接,才能使系统的性能最佳?
系统可采取设置最⼩连接数(minConnection)和最⼤连接数(maxConnection)等参数来控制连接池中的连接。⽐⽅说,最⼩连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较⼩的最⼩连接数,开发起来会快,⽽在系统实际使⽤时设置较⼤的,因为这样对
访问客户来说速度会快些。最⼤连接数是连接池中允许连接的最⼤数⽬,具体设置多少,要看系统的访问量,可通过软件需求上得到。
如何确保连接池中的最⼩连接数呢?有动态和静态两种策略。动态即每隔⼀定时间就对连接池进⾏检测,如果发现连接数量⼩于最⼩连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。
5.数据源(第三⽅插件)
DBCP

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。