zoukankan      html  css  js  c++  java
  • oracle 连接方式

    专用服务器连接:
    用户连接到Oracle时,会自动产生一个对应的服务器进程,此进程通过监听与客户端进程建立连接后就一对一服务于此连接的各类数据库操作

    1、在Linux进程中看不到连接进程
    [oracle@localhost ~]$ ps -aef | grep oracleorcl | grep -v oracleorcl
    [oracle@localhost ~]$

    2、用sysdba登录sqlplus后看到进程:
    [oracle@localhost ~]$ sqlplus / as sysdba

    SQL*Plus: Release 10.2.0.1.0 - Production on Sun Jun 16 11:06:00 2013

    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
    With the Partitioning, OLAP and Data Mining options

    SQL> !ps -aef | grep oracleorcl | grep -v grep
    oracle 4484 4483 0 11:05 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

    3、使用pl/sql在异机上登录(专用服务器方式连接)后看进程,就多了一条专用的服务器进程
    在退出pl/sql后,此进程便终止
    [root@localhost oracle]# ps -aef | grep oracleorcl | grep -v grep
    oracle 5101 1 0 11:16 ? 00:00:00 oracleorcl (LOCAL=NO)

    总结: 客户连接到服务器
    产生一个进程一对一服务该用户进程,用户退出,对应的服务器进程终止
    用户进程提交的数据库请求,由服务器进程与对应实例的进程通信,最终完成数据库的操作


    共享服务器连接
    其实就是连接池的概念,事先将连接数存于连接池中,与专用方式不同的是,客户进程并不会直接与共享服务器通信,因为其是共享的,并不能为某个客户连接所独占。为了共享这些进程,采种一个/一组叫调度器的进程来共享使用连接池中的这些共享服务器进程用户进程发起一条SQL语句,调度器会将该请求放到SGA的请求队列中,并由第一个空闲的进程处理,处理完后共享服务器进程将结果放到原调度器的队列中,调度进程一直在监视这个队列,发现有结果后返回给客户

    总结: 客户连接到服务器
    调度器将该连接存于SGA队列,并由第一个空闲的共享服务器处理,并开始监控该进程
    处理完后将结果返回到原调度器
    调度器进程监听到有结果返回并将结果返回给客户进程

    需要说明的是,无论专用还是共享方式连接,对数据库的操作都由实例的后台进程操作,连接进程本身只是起到与客户进程通信并交换数据的作用

    上网看到些共享服务器连接的缺点:
    1、一般我们以oracle默认的专用服务器方式就行了,没必要使用共享服务器模式。一个是我们是使用中间件(如:weblogic)去连oracle的,中间件本身有连接池机制,另外就是oracle的这个共享服务器方式也做的不够好了,有诸多缺点。

    2、共享服务器的代码路径比专用服务器长,所以它天生就比专用服务器慢。

    3、存在人为死锁的可能,因为它是串行的,只要一个连接阻塞,则该服务器进程上的所有用户都被阻塞,并且极可能死锁。

    4、存在独占事务的可能,因为如果一个会话的事务运行时间过长,它独占共享资源,其它用户只能等待,而专用服务器,每个客户端是一个会话。

    5、共享服务器模式限制了某些数据库特性,例如:不能单独启动和关闭实例,不能进行介质恢复,不能使用Log Miner,并且SQL_TRACE没有意义(因为是共享而不是当前会话的)。

    6、MTS减少的内存实际上是专用服务器模式下每个用户连接到操作系统进程所需的内存,但它却使用SGA的Large_Pool来分配UGA,拆东墙补西墙,所减少的内存是很少的。如果用户会话的连接和断开很频繁,数据库进程的创建和删除的开销会非常大,这种情况最好采用共享服务器模式(否则,应该使用连接池技术)。如果客户端一次连接终身使用(会话生命周期内),使用共享服务器模式的意义不大。因为大部分时间,一个会话就连接到一个服务器进程,无法共享服务器进程。


    专用与共享连接的区别在官网中的详细说明
    About Dedicated andShared Server Processes
    http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/manproc001.htm

    以下是我挑的里面一些比较重要的内容

    Oracle会产生两服务器进程连接实例,主要有两种

    Oracle Database creates server processes to handle the requests of user processes connected to an instance.
    A server process can be either of the following:
    1、A dedicated server process, which services only one userprocess
    只为单个用户进程一对一服务专用服务器进程
    2、A shared server process, which can service multiple userprocesses
    可同时为多个用户进程服务的共享服务器进程

    Your database is always enabled to allow dedicated server processes,
    but you mustspecifically configure and enable shared server by setting one ormore initialization parameters.
    从上面可以看出,数据库总是支持专用连接的,算是默认连接方式。如果需要改成同时共享方式,则需要配置些初始化参数


    Ingeneral, it is better to be connected through a dispatcher and use ashared server process.
    A shared serverprocess can be more efficient because it keeps the number of processes requiredfor
    the running instance low.
    一般来讲,使用共享方式通过调度器连接数据库会更好些,由于其为运行中的实例保持了一定数量的进程连接数,因此更高效

    Inthe following situations, however, users and administrators should explicitly connect to an instance using a
    dedicated server process:
    1、To submit a batch job (for example, when a job can allow little orno idle time for the server process)
    2、To use Recovery Manager (RMAN) to back up, restore, or recover a database
    有上述两种情况则应该要显式的指定为专用服务器连接方式
    1、提交一个批量的任务时
    2、使用RMAN进行备份、恢复或还原数据库时


    To request a dedicated server connection when Oracle Database is configured for shared server,
    users must connect using a net service name that is configured to use a dedicated server.
    Specifically, the net service name value should include the SERVER=DEDICATED clause in the connect descriptor.
    如要用专用方式连接一个配置为共享方式连接的数据库,在连接描述串中必须指定网络服务器(Net Service Name)同时显示指
    定为专用连接方式(Server=DEDICAGED)

  • 相关阅读:
    Thinkphp 模板中使用自定义函数的方法
    thinkphp 邮件发送
    str_replace使用
    SQL备份一张表的数据
    error: Allowed memory size
    LitJson使用
    implode,explode的使用
    ModelState.AddModelError使用
    HTTP 错误 404.2
    验证码显示不出来,在THINKPHP中的使用
  • 原文地址:https://www.cnblogs.com/doclaim/p/3139541.html
Copyright © 2011-2022 走看看