ITPub博客

首页 > 数据库 > Oracle > 数据库连接池的理解

数据库连接池的理解

原创 Oracle 作者:lusklusklusk 时间:2017-02-16 11:08:08 0 删除 编辑
了解连接池之前,我们先了解SESSIONS参数的解释
SESSIONS specifies the maximum number of sessions that can be created in the system.
Because every login requires a session, this parameter effectively determines the
maximum number of concurrent users in the system. You should always set this
parameter explicitly to a value equivalent to your estimate of the maximum number of
concurrent users, plus the number of background processes, plus approximately 10%
for recursive sessions.

连接,是应用程序与数据库交互的一种方式。为什么“数据库连接很昂贵“,下面通过实例解释它究竟是什么。
下面是MySQL数据库创建连接的的一段代码:
[java] view plaincopyprint?
String connUrl ="jdbc:mysql://your.database.domain/yourDBname";  
Class.forName("com.mysql.jdbc.Driver");  
Connection con =DriverManager.getConnection (connUrl);  
当我们创建了一个Connection对象,它在内部都执行了什么:
1.“DriverManager”检查并注册驱动程序; 
2.“com.mysql.jdbc.Driver”就是我们注册了的驱动程序,它会在驱动程序类中调用“connect(url…)”方法。 
3.com.mysql.jdbc.Driver的connect方法根据我们请求的“connUrl”,创建一个“Socket连接”,连接到IP为“your.database.domain”,默认端口3306的数据库。 
4.创建的Socket连接将被用来查询我们指定的数据库,并最终让程序返回得到一个结果。 
简单的获取一个连接,系统却要在背后做很多消耗资源的事情,大多时候,创建连接的时间比执行sql语句的时间还要长。


用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长,每次都得花费0.05s~1s的时间。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的web应用,尤其是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

通过以上描述可以理解,“数据库连接”是一种稀缺的资源,那怎么办呢?可不可以这样,我们查询完数据库后,不关闭连接,而是暂时存放起来,当别人使用时,把这个连接给他们使用。就避免了一次建立数据库连接和断开的操作时间消耗。提高了连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。对了,这就产生了连接池的概念,数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。

当连接池里的连接数足够时,它负责分配连接,允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个,当连接池里的连接数不足时,它负责创建新的连接并放回连接池,当连接池里的连接数很多且都没有被使用时,它负责释放这些连接。


如果应用没有出现明显的高峰,但是发现v$session来自同一台机器的同一个程序的状态为INACTIVE的连接非常多,就要考虑该服务器上的程序的连接池配置了
select count(ss.SID),ss.machine,ss.status,ss.TERMINAL,ss.PROGRAM,ss.USERNAME,ss.CLIENT_IDENTIFIER 
from v$session ss group by ss.machine,ss.status,ss.TERMINAL,ss.PROGRAM,ss.USERNAME,ss.CLIENT_IDENTIFIER having count(ss.SID)>10






现实中在程序中配置的连接池例子
<!--连接池 -->
<bean id="dataSourceDmt" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
<!-- 基本属性 url、user、password -->
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@192.168.1.1:1521:DB" />
<property name="username" value="user" />
<property name="password" value="passwd" />
<!--配置初始化大小、最小、最大 -->
<property name="initialSize" value="2" />
<property name="minIdle" value="2" />
<property name="maxActive" value="100" /> 
<!-- 配置获取连接等待超时的时间(1分钟) -->
<property name="maxWait" value="60000" /> 
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒(1分钟) -->
<property name="timeBetweenEvictionRunsMillis" value="60000" /> 
<!-- 配置一个连接在池中最小生存的时间(连接保持空闲而不被驱逐的最长时间),单位是毫秒(5分钟) -->
<property name="minEvictableIdleTimeMillis" value="300000" />
</bean>




最小的空闲连接数
上述案例配置值为2,就是池子里永远都会有2个连接,不管是否需要和数据库进行数据交互,当程序开始向DB建立第1个对话时,直接就会去使用这个空闲连接,建立第2个会话时也会使用空闲连接,当建立第3个会话时就会新建一个连接

初始连接数
程序启动后就自动创建和DB的会话数,该值过大,则程序启动慢,上述案例配置值为2


最大的活动连接数
程序可以和DB建立的最大会话数,上述案例配置值为100

程序如果没有配置这些,则最小空闲连接数0、初始连接数0、最大活动会话连接数不受限制


上述配置案例,当建立第3个会话时就会新建一个连接,并把这个连接放到连接池里面。依次类推,池子里最多有100个连接,当和DB的连接结束时,池子里的连接状态变成空闲,1分钟后程序会自动清除空闲连接,使池子里保持只有2个空闲连接,所以不会出 现某个时刻并发量100后,池子里永远保持100个连接数,程序会清理掉空闲连接的。程序连接池里的连接就是表示已经和DB建立的连接,连接池里面是10,就是已经建立了10个连接,当然也不会一直在池子里放10个空闲连接,这样100套应用连接同一DB,每个应用都这样的话 ,数据库就是1000个连接


如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。

对数据库而言两点
1.频繁的进行数据库连接操作势必占用数据库服务器很多的系统资源
2.如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。

当客户请求数据库连接时,首先查看应用程序的连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则转到数据库,数据库查看当前所开的连接数是否已经达到最大连接数,例如如果没有达到就重新创建一个请求的客户;如果达到,就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。


对应用程序而言
1.较小的连接池,启动快
2.较多的连接池,启动慢

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30126024/viewspace-2133637/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: linux特殊权限s和t
请登录后发表评论 登录
全部评论
Welcome to Lukes DB HOME。 Oracle OCM、Mysql OCP, 10年DBA工作经验,博客仅记录自己的一个学习过程,不代表完全准确,如有需要,欢迎转载。

注册时间:2015-02-02

  • 博文量
    348
  • 访问量
    1174958