服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > 数据库技术 > Oracle技术 > DBA > 查看文档

oracle 11g新技术-数据库常驻连接池

  当oracle数据库需要处理大量的(数以万计)多主机、多进程客户端连接时,数据库驻留连接池database resident connection pooling (drcp)将是一个理想的解决方案……

  【it专家网独家】前言

  web层和中间层应用软件通常具有多个执行线程,这些线程交替使用关系数据库管理系统(rdbms)的资源。时下,多线程应用软件能够有效地共享与数据库之间的连接,成就了中间层的高可扩性。从oracle 11g开始,应用程序开发人员、管理员以及dba们就能够利用数据库驻留连接池,通过在多进程之间以及能够跨越中间层系统的多线程应用软件之间共享连接来达到上述的可扩性。

  对oracle数据库而言,其连接资源指的是数据库服务器进程、会话以及相关的内存。要令数据库资源消耗最小化,并使终端用户能同时并发访问,应用程序通常能提供多种资源池解决方案。oracle已经为包括oci、occi、jdbc和odp.net等在内的所有数据访问驱动器提供了连接池解决方案。这些解决方案利用了一个应用程序进程中的多线程能够共享资源的能力。

  然而,有很多中间层部署是面向进程的,也有很多线程之间的资源共享不够充分。这些部署可以归结为两大主要类群:

  1、 单线程应用软件,如大多数的php应用软件。

  2、 多线程应用软件,能够得益于跨进程甚至跨系统之间的共享,常负载大量的闲置连接,例如冗余进程。

  当需要应付大量用户的请求时,这些应用软件往往能够保持数据库的永久连接,避免了同时完成多个任务时,连接的创建和终止的架空。中间层进程往往被设置成处理终端用户并发请求,终端用户并发请求比要后端数据库并发访问更高级。如果所有的中间层进程都与数据库进行雇用就连接,那么由于数据库资源的约束,中间层的可扩性就会受到限制。

  oracle共享服务器模式通过把oracle服务器进程集中在能够被多连接共享的数据库端,在一定程度上解决了这个问题。但是会话资源是不能够共享的。当客户需要长期保持会话(例如长线交易),而事实上只有少量客户在某些时间点会进行数据库活动时,这个模式很有用。 然而,在数据库活动需要会话,并且多请求的数据库活动并不依赖于会话状态的情况下,通过使用数据库驻留连接池,应用软件能达到更高的可扩性。

  数据库常驻连接池

  数据库驻留连接池是oracle database 11g的一个新特性,专门为了解决在需要支持大量连接的环境对可扩性的迫切需求而设计的。数据库驻留连接池把数据库服务器进程和对话汇合起来(这样的组合称之为池服务器),通过从单主机或不同主机发出的多个应用软件进程的连接进行共享。由一个连接代理(connection broker)进程控制着数据库后台进程中的池服务器。连接代理会持续的连接客户并对客户进行验证。当需要进行某种数据库活动时,客户将请求连接代理提供池服务器,使用完毕后再将它们释放以供其他客户重新使用。

  当池服务器处在使用当中时,相当于一台专用服务器。对于来自常驻通道中的客户端连接请求,连接代理会为其选择一个合适的池服务器,并把客户端请求交给该池服务器处理,不再干涉。此后客户通过和该池服务器的直接对话来完成所有的数据库活动。当客户完成请求任务释放池服务器后,连接代理将重新接管该池服务器。

  数据库常驻连接池的使用

  数据层

  激活和配置连接池:数据库驻留连接池附有一个简单易用的数据库管理应用程序接口(api)。每个11g的数据库内存结构和后台进程中都有一个默认连接池。dba可以使用如下plsql包“dbms_connection_pool”来配置和管理连接池。  

sql>execute dbms connection pool. configure pool(null, minsize=>10,
  maxsize=>100,
  inactivity timeout=>300,
  max_think_time=>600, …);

  上述脚本是一个可选项,在需要更改默认设置时使用。

  必须在客户端发出连接请求前启动连接池。下面的命令可以调出连接代理,代理会通过数据库监听器进行自注册。

  sql> execute dbms_connection_pool.start_pool;

  一旦通过这个方式激活,连接池将随着数据库后台进程的重启而自动重启,直到使用“dbms_connection_pool.stop_pool”命令关闭连接池。

  应用层

  客户端与数据库驻留连接池的连接:oci和occi客户端通过tcp/ip协议和简单的数据认证(用户名/密码认证)即可连接到数据库驻留连接池界面。客户端必须通过以下的连接字符串将服务器类型指定为pooled:  

myhost.dom.com:1521/sales:pooled
  or
  (description=(address=(protocol=tcp) (host=myhost.dom.com)
  (port=1521))(connect_data=(service_name=sales)
  (server=pooled)))

  池服务器的共享:数据库驻留连接池保证在不同的用户间无法共享池服务器,但允许同一应用软件的不同后台进程共享池服务器。此外,即便是同一个用户,数据库驻留连接池也会根据程序“connection classes”选择的不同,对池服务器进行逻辑分组。connection class是客户端发出调用一个池服务器的请求时,提供的一个逻辑名。它表明客户端需要重新调用一个池服务器,而这个池服务器曾被其他客户端用相同的逻辑名调用过。举个例子,ap应用程序套件可能倾向于在其内部共享池服务器,但不会和hr应用程序套件共享。应用程序遗留在对话中的状态差异,以及一些诸如语言设置等在内对话特有属性可能是影响不同类型的应用程序套件对池服务器共享产生偏好的主要因素。当客户端无法从连接池中复用一个会话,可以请求建立一个新的对话。

  oci客户端使用数据库常驻连接池

  1. 使用函数“ocisessionpoolcreate( )”以及数据库驻留连接池的连接字符串创建一个oci session pool。此连接池能够保持与连接代理之间的永久连接。

  2. 在ocisessionpool中调用函数“ocisessionget( )”和“ocisessionrelease( )”以获取或释放池服务器。

  3.在调用函数ocisessionget之前,指定一个connection class值作为验证句柄(auth handle)的一个属性。

  4. 如果没有指定连接类型,ocisessionpool名将被用作调用ocisessionpool的所有请求所用的连接类型,这样共享只能存在一个会话缓冲池内,就相当于一个普通的客户端会话缓冲池应用程序了。

  occi客户端使用数据库常驻连接池

  1. 调用函数“environment::createstatelessconnectionpool( )”以及数据库驻留连接池的连接字符串创建一个occi stateless connection pool。此连接池能够保持与连接代理之间的永久连接。

  2. 在statelessconnectionpool中调用函数“getconnection(…”appcc”…)”和“releaseconnection( )”,以获取或释放池服务器。

  php客户端使用数据库驻留连接池

  oracle计划加强与开源组织的合作,以增强php-oci8的驱动程序对数据库驻留连接池的支持。这将使php应用软件能够以最小的资源限制与数据库保持永久的连接。

  调整数据库常驻连接池的设置

  根据可用的硬件资源和并发需求,可灵活配置连接池的大小。参数minsize设置连接池能够提供并一直保持的服务器的最少数量。参数maxsize则设置池服务器数量的上限。如果所有的连接池服务器已经都在被使用,且连接池提供的服务器数量达到了maxsize设置的上限时,客户端请求将会置于等待状态,直到某个池服务器被释放出来。

  参数inactivity_timeout设置可帮助连接池结束闲置的池服务器,使资源利用最优化。通过设置max_think_time参数,可防止池服务器被一些不良客户端程序长期锁定。参数num_cbrok和maxconn_cbrok可用于分配从客户端到多连接代理的永久连接数目。当操作系统需要限制每个进程的最大连接数时,该功能尤其适用。

  dba视窗可用于监控数据库驻留连接池的性能状况,包括检查忙碌和闲置的服务器数量以及被连接池处理或忽略的请求数量(对照客户端请求总量)等。此外,通过调用dbms_connection_pool.alter_param和“dbms_connection_pool.configure_pool,还可以随时调整数据库驻留连接池的参数配置。

  数据库常驻连接池的可扩性

  数据库驻留连接池通过在耗费最少资源的前提下保持使数据库的永久连接,提高了数据库和中间层的可扩性。数据库的实际连接资源仅被那些活跃连接所使用,并可通过设置连接池的大小来控制使用规模。

  这能带来多少性能上的提升呢?每个闲置的客户端程序连接对内存需求很小,当每个客户端连接占用数据库会话持续时间很短的情况下,数据库驻留连接池所支持的客户端连接数量比专用服务器和共享服务器的要多得多。在oracle进行的一次以2gb为系统容量的测试中,据库驻留连接池所能支持的连接数量是共享服务器的10倍,是专用服务器的20倍。

  oracle以oci客户端为样本,对数据库驻留连接池进行了性能测试。客户端采用独立的oci应用进程对池服务器发出并发请求,并执行查询和dml操作。其中,只读事务量和读写事务量的比例为3:1。只读事务包括一个“获取连接”操作,执行5个select指令以及一个“释放连接”操作。而读写事务除了包括以上操作外,还增加了一个update指令。客户端提交请求之间的“思考”时间(think time,即等待调用的时间,超过此时间不调用,那么池服务器将被释放)为15秒。数据库驻留连接池的内存结构和后台进程以一台具有四个2.8ghz 的intel xeon cpu和2gb内存的机器为主机,运行32位的red hat enterprise linux version 4。连接池支持一个连接代理和100个池服务器。客户端和数据库使用的软件均为oracle 11g beta5。cpu和内存的使用情况是通过vmstat指令获取的,并利用oracle awr reporting工具获取数据吞吐量。操作系统文件的描述符长度被限制在20000。当输入连接量增加并且连接对内存的需求最小时,数据的吞吐量会进行线性的调整,使其与连接数回复到一定比例。

it专家网原创文章,未经许可,严禁转载!

扫描关注微信公众号