Oracle中的Connect、Session和Process的区别与联系

预备知识

在正式介绍Connect、Session和Process之前,先介绍oracle的一个概念:
Shared Server模式和Dedicated Server模式

在创建数据库时,可以选择创建哪种模式的数据库。

简单描述2种模式的区别:
专用服务器模式 (Dedicated Server): 每次访问oracle服务时,创建一个新的进程。
共享服务器模式(Shared Server): 类似于数据库连接池的概念,初始化的时候就会创建一批服务器连接。

  • 如果是Dedicated Server,则客户端只能创建dedicated connection进行连接
  • 如果是Shared Server,则客户端能创建dedicated server connection和shared server connection,只要在service name中指定server=dedicated or server=shared.(可通过修改tnsnames.ora文件测试)

Connect、Session和Process介绍

session和connection的定义:

connection(连接):是一个物理的概念,它指的是一个通过网络建立的客户端和专有服务器(Dedicated Server)或共享服务器(Shared Server)的一个网络连接,既是一条物理路径。

session(会话):是一个逻辑的概念,它存在于实例中,一个connection可以拥有多个session也可以没有session,同一个connection上的不同session之间不会相互影响。

session和connection的区别与联系:

  • 一个用户对应一个session,但不一定对应一个connection ,因为几个session可以共享一个connection。

  • 在Dedicated Server(专用服务器)连接模式下,session和connection一一对应,且个数上session = connection。

  • 在Shared Server(共享服务器)连接模式下,一个processes可以对应多个session, 个数上session >= connection。

  • 在Shared Server的Multiplexing Session模式下,session >= connection,且并不一一对应。

使用plsql连接oracle数据库后,每新增一个查询窗口执行查询后,使用语句:
select * from v$session where username is not null
就可以查看到多了一个会话session
因此使用plsql存在大量未关闭的执行窗口,就会占用大量的session数。所以说,仅需一个连接就可以达到所谓的最大并发用户数。

看到一个比较形象的比喻:

有A/B两个城市,需要从A运送白菜到B城

我们先建设一条公路(connection)
然后运送白菜过去,包括准备白菜和运送白菜以及返回等一系列的动作(session)

一条公路,可以运送0-n次白菜(session >= connection)
当然从A到B的公路也可能不只一条(connection >= 1)

某一次运送白菜,可以在真正上路时才开通某一条道路(需要session时才建connection)
一次运送不会影响别的运送的状态(同一connection上的不同session之间互不影响)

对应到数据库
A代表客户端进程
B代表服务器端进程
公路代表连接,
运送一次白菜代表一个会话

一个连接可以进行多次的会话
一个会话可以不依赖于某个连接,甚至没有连接(当我准备好了,真正开始运送时再建立连接)
一个会话不会影响别的会话

connects (连接)、sessions(会话)和pocesses(进程)的关系:

  • onnect(连接):使用plsql连接到oracle后,就是建立了一个连接(一次login)
  • session(会话):决定同时登陆到数据库的并发用户数(数据库层面)
  • processes(进程):也决定同时登陆到数据库的并发用户数(操作系统层面)

session的设置和processes的设置共同决定了数据库允许的最大并发用户数。

每个sqllogin称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,一个会话对应一个服务器进程(process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。

常用查询sql

--允许最大进程数processes:
select value from v$parameter where name = 'processes' ;

--当前已用进程数processes:
select count(*) from v$process ;

--最大允许会话数session:
show parameter sessions

--当前已用会话数session:
select count(1) from v$session;

--查询某客户端连接数据库的session值:
select * from v$session where terminal='RUIFEI'

--查询某客户端连接数据库的process值:
select * from v$process
where addr in
(select paddr from v$session where terminal='RUIFEI')

--如果是专用服务器方式连接,session和process是一样的。

--查看当前数据库使用的模式:
select count(*) from v$shared_server;(结果不为0,表示共享模式)

使用共享模式连接示例:

ORCL_1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.142)(PORT = 1521))
)
(CONNECT_DATA =
(server = shared )
(sid = orcl)
)
)

使用专用服务器模式连接示例:
ORCL_1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.142)(PORT = 1521))
)
(CONNECT_DATA =
(server = dedicated )
(sid = orcl)
)
)


参考:
https://blog.csdn.net/feiyu8607/article/details/6936203
https://blog.csdn.net/ruyi574812039/article/details/84760951
https://blog.csdn.net/cunxiyuan108/article/details/5808331

猜你喜欢

转载自blog.csdn.net/Ruishine/article/details/121746453