在专用连接方式中
每一个连接到数据库服务器的客户端请求
服务器会和客户端之间建立起连接
这个连接用于专门处理该客户端的所有请求
直到用户主动断开连接或网络出现中断
在连接处于空闲时
后台进程PMON会每隔一段时间
就会测试用户连接状况
如果连接已断开
PMON会清理现场
释放相关的资源
专用连接相当于一对一的连接
能够快速的响应用户的请求
当然
在连接的时候
首先要创建PGA(Program global area)
参数pga_aggregate_target 决定可以由所有服务器进程使用的内存的总量
参数workarea_size_policy 决定是用手动管理还是自动管理
如
SQL> show parameter pga_aggregate_targetNAME TYPE VALUEpga_aggregate_target big integer SQL> show parameter workarea_size_policyNAME TYPE VALUE
workarea_size_policy string AUTO
而Pga由三部分构成其中有可以配置的 sort_area_size还有会话信息堆栈空间
sort_area_size是用户用来排序的内存空间
SQL> show parameter sort_area_sizeNAME TYPE VALUEsort_area_size integer
如果排序的数据量比较大排序空间不够用这时Oracle通过专用算法对数据进行分段分段后的数据转移到临时表空间中在临时表空间中进行排序完成后再合在一起返回给请求的用户这是大排序为什么使用临时表空间的原因
在专用连接中连接所需要的资源全部在PGA中分配该内存区为指定连接私有其它进程不能访问
专用连接采用一对一的连接方式能很的响应用户的请求但是如果连接用户太多时由于要对每一个连接分配资源因此连接数受硬件限制比较大为了克服这种情况Oracle 提出了共享连接的连接方法即用一个服务器的进程响应多个用户连接与专用连接不同有连接时才创建PGA不同共享连接在实例一启动就分配指定数量的服务器进程所用户的连接以排队的方式由分配器指定给服务器进程其它的进程排队等待只要用户的请求一执行完就会马上断开连接分配器会把空闲的服务器进程分配给其它排除的进程
采用共享连接可以有效的提高服务器资源的利用率但是对一个分配器只支持一种协议每个分配器有自已的排队队列在请求的任务完成后由分配器将操作结果返回给相应的用户进程但是共享连接的建立 需要Oracle的监听进程分配器共享服务器进程才能共同完成一个连接的创建所以连接的分配也需要一定的时间和资源
在共享连接中sort_area_size 将在 SGA 的 Large_pool 中分配
上面所说的是两种连接的创建方法和管理方法在理想的情况下对于长事务或大事务使用专用连接可以有效的提高系统的性能减少用户等待和事务的排队提高系统的利用率对于超短事务和短事务小事务使用共享连接方式可以在资源与效率之间达到一种平稀比如对于OLTP 系统使用专用连接而对于网站等可以使用共享连接 那么能不能在OLTP系统中使用共享连接呢?如果能使用那么能不能提高性能呢?
OLTP系统一般而言有较多的长事务和大事务如用户的某几步操作必须作为一个事务对于这种情况我们分析一下看看会发生什么样的情况
分析首先有一个前提那就是用户请求数要大于共享服务器进程数否则减去分配器管理性能支出共享连接的性能要低于专用连接
如果用户请求数大于共享服务器进程数那么肯定有请求是在排队假定目前一个共享服务器进程正在执行一个长事务那么请求队列就要一直等直到当前的事务结束从用户请求的角度看很明显响应的时间加长了从服务器角度看我们先看一下由网友 WESTLIFE_XU 提供的实例
共享连接和长事务是背道而驰的长事务的共享连接会造成shared 进程的严重排队造成性能的严重下降给你看一个极端的例子以前的同事公司的
代码:
举个例子个request共享比说个共享进程每个shared进程在一个时间内只能处理一个request也就是说个进程在同一时间内只能处理个request如果一个request需要很长的处理会造成其它请求的严重排队
shared进程要求客户端的每个request要特别快如果客户端的一个request就占了很长时间那别的request就得一直等着共享就没有什么意义了
从上面可以看出如果在有大事务和长事务的OLTP系统中系统会比原来更慢!
综合来看共享连接和专用连接各有所长关键是看应用能适用于自已应用的连接方式就是好方式