目录
结论
总结:连接数的数量和会话数数量没有相互决定性关系。
进程连接数processes = 数据库连接数Connections ≠ 会话连接数Sessions
概念
在Oracle的官方文档上,对Session和Connection是这样解释的:
Connection: Communicate pathway between a client process and an Oracle database instance.
连接:一个客户端进程和Oracle数据库实例之间的通信链路。
Session: A logical entity in the database instance memory that represnts the state of a current user login to a database. A single connection can have 0, 1 or more sessions established on it.
会话:用于展示当前登录到数据库用户的状态的数据库实例内存中的一个逻辑实体。一个单独的连接可以有0,1,或者更多的会话。
事实上,Connection并不是直接建立在用户进程和数据库实例之间的。而是在用户进程和Server Process(服务器进程)之间的,因此有一个Connection就一定会有一个用户进程和一个服务器进程,但不一定会存在Session。官方建议 sessions = process * 1.1 + 5
例子
有A/B两个城市,需要从A运送白菜到B城
我们先建设一条公路
然后运送白菜过去,包括准备白菜和运送白菜以及返回等一系列的动作。
一条公路,可以运送0-n次的白菜
当然从A到B的公路也可能不只一条。
某一次运送白菜,可以在真正上路时才开通某一条道路
一次运送不会影响别的运送的状态
对应数据库
A代表客户端进程
B代表服务器端进程
公路代表连接,
运送一次白菜代表一个会话
一个连接可以进行多次的会话
一个会话可以不依赖于某个连接,甚至没有连接(当我准备好了,真正开始运送时再建立连接)
一个会话不会影响别的会话
关于数据库连接数sql
1、查看当前的数据库连接数
select count(*) from v$process; --当前的数据库连接数
2、数据库允许的最大连接数
select value from v$parameter where name ='processes';
show parameter processes; --数据库允许的最大连接数
3、修改数据库最大连接数
alter system set processes = 300 scope = spfile; --修改最大连接数,修改processes和sessions值必须重启oracle服务器才能生效
4、数据库连接数消耗情况
select b.MACHINE, b.PROGRAM, b.USERNAME, count(*) from v$process a,v$session b where a.ADDR = b.PADDR and b.USERNAME is not null group by b.MACHINE, b.PROGRAM, b.USERNAME order by count(*) desc;
5、查看数据库的并发连接数
select count(*) from v$session where status='ACTIVE';
关于数据库会话数sql
1、当前的session连接数
select count(*) from v$session --当前的session连接数
2、当前session会话数的配置参数
select value from v$parameter where name = 'sessions';
show parameters sessions; --查看最大会话数
3、修改最大会话数
alter system set sessions=555 scope=spfile;
4、查看当前数据库建立的会话详情
select sid,serial#,username,program,machine,status from v$session;
5、当前活动的session
SELECT S.USERNAME,
S.SID,
S.SERIAL#,
S.INST_ID,
S.EVENT,
S.WAIT_CLASS,
S.SQL_EXEC_START,
S.LOGON_TIME,
S.ACTION,
SQ.SQL_TEXT
FROM GV$SESSION S, GV$SQLAREA SQ
WHERE S.STATUS = 'ACTIVE'
AND S.USERNAME IS NOT NULL
AND S.SQL_ID = SQ.SQL_ID;
6、某一时段的历史session
select t.con_id,t.sample_time,t.session_id,t.session_serial#,t.SESSION_TYPE, t.SESSION_STATE, t.EVENT, t.BLOCKING_SESSION, t.BLOCKING_SESSION_STATUS, t.MACHINE, t.PROGRAM, t.wait_time,t.time_waited, t.SQL_EXEC_START
, t.P1TEXT, t.P2TEXT, t.P3TEXT, t.P1, t.P2, t.P3,NVL(s1.SQL_ID, s2.SQL_ID) AS SQL_ID, NVL(s1.SQL_TEXT, s2.SQL_TEXT) AS SQL_TEXT
from gv$active_session_history t
LEFT JOIN V$SQLSTATS s1 ON t.SQL_ID = s1.SQL_ID
LEFT JOIN V$SQLSTATS s2 ON t.TOP_LEVEL_SQL_ID = s2.SQL_ID
where t.sample_time between to_date('20220307 11:10','YYYYMMDD HH24:MI') and to_date('20220307 12:00','YYYYMMDD HH24:MI')
and t.SESSION_TYPE = 'FOREGROUND'
ORDER by t.sample_time,t.session_id;