1. 程式人生 > >理解oracle中連線和會話

理解oracle中連線和會話

比喻:

一個物理連線相當於一條現代化超安全的高速公路,

每個會話(jdbc connection)相當於該公路上100%遵守交通秩序的車輛。

一個會話中的提交不會影響該連線上的任何其他會話。

實際上,一條連線上的各個會話可以使用不同的使用者身份!

另外,一個會話可以有連線也可以沒有連線,相當於這輛車停在車庫,並沒有行駛到公路上,這時它是空閒的,

當行駛到公路上,就相當於給它建立了一個物理連線

相關圖書:Oracle Database 10g安全性高效設計

隱式連線緩衝:通過建立真正的資料庫物理連線的邏輯對映來完成連線池的管理工作,在應用程式中關閉連線池的連線並不會斷開物理連線,而是把邏輯連線歸還給連線池,並可用於下次請求。結論(隱式連線緩衝建立的連線都是物理連線)

在weblogic中選擇了驅程的類別後,實際上要看我們採用的oracle驅動,其中負責隱式連線緩衝的驅動位於/%ORACLE_HOME%/jdbc/lib/classes12.jar

連線並不是會話的同義詞,發現這一點時很多人都很詫異。在大多數人眼裡,它們都是一樣的,但事實上並不一定如此。在一條連線上可以建立0個、一個或多個會話。各個會話是單獨而且獨立的,即使它們共享同一條資料庫物理連線也是如此。一個會話中的提交不會影響該連線上的任何其他會話。實際上,一條連線上的各個會話可以使用不同的使用者身份! 在Oracle中,連線只是客戶程序和資料庫例項之間的一條特殊線路,最常見的就是網路連線。這條連線可能連線到一個專用伺服器程序,也可能連線到排程器。如前所述,連線上可以有0個或多個會話,這說明可以有連線而無相應的會話。另外,一個會話可以有連線也可以沒有連線。使用高階Oracle Net特性(如連線池)時,客戶可以刪除一條物理連線,而會話依然保留(但是會話會空閒)。客戶在這個會話上執行某個操作時,它會重新建立物理連線。下面更詳細地定義這些術語: * 連線(connection):連線是從客戶到Oracle例項的一條物理路徑。連線可以在網路上建立,或者通過IPC機制建立。通常會在客戶程序與一個專用伺服器或一個排程器之間建立連線。不過,如果使用Oracle的連線管理器(Connection Manager ,CMAN),還可以在客戶和CMAN之間以及CMAN和資料庫之間建立連線。CMAN的介紹超出了本書的範圍,不過Oracle Net Services Administrator’s Guide(可以從http://otn.oracle.com免費得到)對CMAN有詳細的說明。 * 會話(session):會話是例項中存在的一個邏輯實體。這就是你的會話狀態(session state),也就是表示特定會話的一組記憶體中的資料結構。提到“資料庫連線”時,大多數人首先想到的就是“會話”。你要在伺服器中的會話上執行SQL、提交事務和執行儲存過程。 可以使用SQL*Plus來看一看實際的連線和會話是什麼樣子,從中還可以瞭解到,實際上一條連線有多個會話的情況相當常見。這裡使用了AUTOTRACE命令,並發現有兩個會話。我們在一條連線上使用一個程序建立了兩個會話。以下是其中的第一個會話: sqlplus "storm/unimas" SQL> select username, sid, serial#, server, paddr, status from v$session where username = 'STORM'; USERNAME     SID    SERIAL# SERVER    PADDRSTATUS ------------------------------ ---------- ---------- --------- -------- -------- STORM     148 60 DEDICATED 30A1BDCC INACTIVE SQL> set autotrace on statistics SP2-0618: Cannot find the Session Identifier.  Check PLUSTRACE role is enabled SP2-0611: Error enabling STATISTICS report SQL> 碰到錯誤,原來是沒有新增PLUSTRACE role sqlplus "sys/unimas as sysdba" SQL> create role plustrace; Role created. SQL> grant select on v_$sesstat to plustrace; Grant succeeded. SQL> grant select on v_$statname to plustrace; Grant succeeded. SQL> grant select on v_$mystat to plustrace; Grant succeeded. SQL> grant plustrace to dba with admin option; Grant succeeded. SQL> grant plustrace to STORM; Grant succeeded. 重新登入storm SQL> set autotrace on statistics USERNAME     SID    SERIAL# SERVER    PADDRSTATUS ------------------------------ ---------- ---------- --------- -------- -------- STORM     141180 DEDICATED 30A1BDCC INACTIVE STORM     148 62 DEDICATED 30A1BDCC INACTIVE SQL> disconnect 從技術上講,這個命令應該叫DESTROY_ALL_SESSIONS更合適,而不是DISCONNECT,因為我們並沒有真正物理地斷開連線。 在SQL*Plus中要真正地斷開連線,應該執行“exit”命令,因為你必須退出才能完全撤銷連線。 SQL> select username, sid, serial#, server, paddr, status from v$session where username = 'STORM'; no rows selected 可以看到,這個賬戶名下沒有會話,但是仍有一個程序,相應地有一條物理連線(使用前面的ADDR值) SQL> select username, program from v$process where addr = hextoraw('30A1BDCC'); USERNAMEPROGRAM --------------- ------------------------------------------------
[email protected]
(TNS V1-V3) SQL>  所以,這就有了一條沒有相關會話的“連線”。可以使用SQL*Plus的CONNECT命令(這個命令的名字也起得不恰當),在這個現有的程序中建立一個新會話(CONNECT命令叫CREATE_SESSION更合適):可以看到,這個賬戶名下沒有會話,但是仍有一個程序,相應地有一條物理連線(使用前面的ADDR值) SQL> select username, sid, serial#, server, paddr, status from v$session where username = 'STORM'; USERNAME     SID    SERIAL# SERVER    PADDRSTATUS ------------------------------ ---------- ---------- --------- -------- -------- STORM     153 58 DEDICATED 30A1BDCC INACTIVE 可以注意到,PADDR還是一樣的,所以我們還是在使用同一條物理連線,但是(可能)有一個不同的SID。我說“可能有”,是因為也許還會分配同樣的SID,這取決於在我們登出時是否有別人登入,以及我們原來的SID是否可用。 另外:
Serial# is in v$session. It is an Oracle generated value used in
combination with the SID to create a unique session identifier.
SID和SERIAL合起來能作為一個session的唯一標識。

1.概念不同:

連線是指物理的客 戶端到oracle服務端的連線。一般是通過一個網路的連線。

在已建立的連線 上,建立客戶端與oracle的會話,以後客 戶端與oracle的互動都在一個會話環境中 進行。

2.  關係是多對多:[同意網友的意見,應該是1對 多。一個會話要麼沒有連線,要麼在一個連線上。]

一個連線上可以建 立0個,1個,2個,多個會話。

Oracle允許存在這樣的會話,就是失去了物理連線的會 話。

3.概念應用:

loraclesessions引數決定的是會話數而不是物理連線數。

loracle的臨時表中的資料是各會話間隔離的,而與連線 概念無關。

ljdbcconnection,對oracle是一個會話的概念。

4.實際應用:

連線 池,為了提高資料庫互動效率,一般驅動程式都有連線池概念的實現。

      Oracle不同的驅動提供兩種連線池概念。

一種譯 為隱式連線緩衝

OracleDataSource ods =newOracleDataSource();

            ods.setURL("jdbc:oracle:thin:@10.1.3.60:1521:orcl");

            ods.setUser("NC50_DEV");

            ods.setPassword("NC50_DEV");

            ods.setConnectionCachingEnabled(true);

          java.util.Properties jup =newjava.util.Properties();

            jup.setProperty("InitialLimit","1");

            jup.setProperty("MinLimit","1");

            jup.setProperty("MaxLimit","2");

            ods.setConnectionCacheProperties(jup);

           Connection cx0 = ods.getConnection();

隱式連線緩衝在第一次getconnection()時將根據配置初始化連線,並在每一個連線上建立一個會話。然後從這些會話中返回一個給本次 呼叫。以後如果在本次connection.close()前 呼叫getconnection(),將肯定 得到另外一個會話。如果初始時建立的會話不夠了,那麼將新建物理連線,並在連線上建立一個會話。當然不能超過兩個限制:1.MaxLimit【見程式,限制物理連線數】。

2.sessionsoracle引數】。每次close()並不關閉實際的會話,而是返回連線緩衝中, 供另一個getconnection()使 用。所以可以得知,如果一個getconnection()中 給某一個會話級臨時表插入資料,然後close(),那 麼之後如果這個會話被重新得到,是可以看到插入的資料的。

一種譯 為OCI連線池。

OracleOCIConnectionPool ods =newOracleOCIConnectionPool();

            String tns ="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS="

                    +"(PROTOCOL=TCP)(HOST=10.1.3.60)(PORT=1521)))"

                    +"(CONNECT_DATA=(SERVICE_NAME=ORCL)))";

            ods.setURL("jdbc:oracle:oci:@"+ tns);

            ods.setUser("NC50_DEV");

            ods.setPassword("NC50_DEV");

            java.util.Properties jup =newjava.util.Properties();

    jup.setProperty(OracleOCIConnectionPool.CONNPOOL_MIN_LIMIT,"2");       jup.setProperty(OracleOCIConnectionPool.CONNPOOL_MAX_LIMIT,"2");

    jup.setProperty(OracleOCIConnectionPool.CONNPOOL_INCREMENT,"0");

            ods.setPoolConfig(jup);

        Connection cx0 = ods.getConnection();

            OCI連線池在第一次getconnection() 時將根據配置初始化連線,並在每一個連線上建立一個會話。注意,連線上一旦建立了一個會話,這個連線將還可以再建會話。那麼在此時,會任取一個建完會話的 物理連線再建一個會話返回。這樣看來似乎OCI連線池只需建立一個物理連線就可以建立任意多的會話,當然這時也要受限於oracle允許的sessions設定。實際上OCI到底1個物理連線對應 多少個會話,OCI自身有一個對應用透明的管理。但是CONNPOOL_MAX_LIMIT一定是限制住此客戶端可用的物理連線數的。對於OCI連線池,每一個connection.close()都將實際關閉會話, 但物理連線保留。所以可以得知,如果一個getconnection()中 給某一個會話級臨時表插入資料,然後close(),那 麼此資料將被刪除。

5. 關於專用伺服器模式下processes引數

對於隱式連線緩衝,每一個連線上建立一個會話,對於每一個會話都將對應一個dedicated process

對於OCI連線池,只有物理 連線上建立的那個會話才對應一個dedicated process(這裡記為DP_A,DP_B)。 而其他會話對應一個PSUEDO process.這 是一個輕量級process,它是不算processes數的。

所以關於這個問題“專用伺服器模式是一個物理連線對應一個process,還是一個會話對應一個process?”,從這裡可以理解oracle的設計思路確實一個是會話對應一個process,與物理連線不相關。但是實際的實現呢?當oci獲得的connection上執行sql時,ORCLED的響應還是會藉助到DP_A,DP_B上,如果DP_A,DP_B正忙,那就得一樣地等。

補 充:
1.物理連線一般跟網路資源有關的。通過網路的一個物理連線會佔用客戶端一個新的臨時埠。
2.JTA事務管理,是針對多個會話的 DB訪問,維繫在一個事務中。這個概念是多會話,而不是刻意強調多個數據源(兩個ORACLE),甚至異種資料庫。JDBC事務管理,是建立在一個會話上 的事務。
3.processes引數控制的是oracle所有程序/執行緒,不僅僅是專用server,包括後臺普通程序,典型的如果在MTS模式 下,還包括dispatcher。而OCI下連線PSUEDO process的作用有點類似MTS模式下的dispatcher,但它不受processes限制。同時注意即使有這個PSUEDO process存在,專用模式和MTS還是 截然不同,因為專用模式下必須等到DP_A,DP_B的 客戶會話關閉後才可用DP_A,DP_B來服 務PSUEDO process對應的客戶會 話,而MTS是不等會話結束就拉過來服務了。
官方解釋

1.1 connection:    A connection is a physical path from a client to an Oracle instance. A connection is established either over a network or over an IPC mechanism. A connection is typically between a client process and either a dedicated server or a dispatcher. However,using Oracle’s Connection Manager (CMAN), a connection may be between a client and CMAN, and CMAN and the database. 1.2 session    A session is a logical entity that exists in the instance. It is your session state, or a collection of data structures in memory that represents your unique session. It is what would come first to most people’s minds when thinking of a “database connection.” It is your session in the server, where you execute SQL, commit transactions, and run stored procedures. 1.3 connection vs. session    A connection may have zero, one, or more sessions established on it. Each session is separate and independent,even though they all share the same physical connection to the database. A commit in one session does not affect any other session on that connection. In fact, each session using that connection could use different user identities!    In Oracle, a connection is simply a physical circuit between your client process and the database instance—a network connection, most commonly. The connection may be to a dedicated server process or to a dispatcher. As previously stated, a connection may have zero or more sessions, meaning that a connection may exist with no corresponding sessions. Additionally, a session may or may not have a connection. Using advanced Oracle Net features such as connection pooling, a physical connection may be dropped by a client, leaving the session intact (but idle). When the client wants to perform some operation in that session, it would reestablish the physical connection.

相關推薦

理解oracle連線會話

比喻: 一個物理連線相當於一條現代化超安全的高速公路, 每個會話(jdbc connection)相當於該公路上100%遵守交通秩序的車輛。 一個會話中的提交不會影響該連線上的任何其他會話。 實際上,一條連線上的各個會話可以使用不同的使用者身份! 另外,一個會話可以有連線也可

oraclerownumrow_number()

cnblogs 計算 順序分配 每一個 total tom ins 使用 div row_number()over(partition by col1 order by col2)表示根據col1分組,在分組內部根據col2排序,而此函數計算的值就表示每組內部排序後的順序編

Oraclechr()ascii()函數(附:常用字符與ascii對照表)

關鍵字 回車 pps body api adding com eve amp Oracle中chr()和ascii()函數(附:常用字符與ascii對照表) 關鍵字:chr() chr()函數作用:“特殊”字符特殊處理 在PLSql中可查詢相對應的字碼與特殊符 chr()函

ORACLENVLlCOALESCE的區別

oracl 第一個 ssi 必須 如果 不一致 miss 兩個 oal nvl(COMMISSION_PCT,0)如果第一個參數為null,則返回第二個參數如果第一個參數為非null,則返回第一個參數 COALESCE(EXPR1,EXPR2,EXPR3...EXPRn)從

OracleBlobClob

oracl rac clas 存儲 tchar ring jdbc input inpu Blob是指二進制大對象也就是英文Binary Large Object的所寫;Clob是指大字符對象也就是英文Character Large Object的所寫。因此這兩個類型都是用

ORACLESIDSERVICE_NAME的區別

spring 好的 java應用程序 系列 sdn 文件 數據 jdbc 修改 先來講一個小故事,2015年6月份,有個客戶遷移了數據庫,由單實例數據庫變成了RAC。JAVA應用程序出現了無法連接數據庫的情況,但是PL/SQL能連接上數據庫。由於項目比較龐大,

Oracleinstrsubstr 的應用

instr函式 instr函式用於從指定的位置開始,從某物件中查詢第N個與模式匹配的字串。 例項:   SELECT instr(‘syranmo’,’s’) FROM dual; – 返回 1   SELECT instr(‘syranmo’,’ra’) FROM dual; –

ORACLEdatetimestamp的相互轉化

原文章地址:https://blog.csdn.net/chenlong331409178/article/details/47441025 oracle 中date型別精確可以年月日,時分秒,timestamp型別可以精確的秒一下 data轉為timstamp data 轉為timstam可

oracleadd_monthstrunc用法

  oracle中add_months和trunc用法 2012-06-13 13:45  646人閱讀  評論(0)  收藏  舉報 oracle date sql 工作

Oraclesyssystem使用者的區別

  Oracle中sys和system使用者的區別 1.資料庫的啟動需要以SYSDBA/SYSOPER身份登入。 2.如果在同一主機上使用IPC連線到資料庫使用作業系統授權,登入任何一個使用者都可以擁有as sysdba和as sysoper。 3.sys和system使用

Oracleanyall

any   select empno,sal from emp where sal > any(3000,950); 只需要大於(3000,900)中的任意一個即可     all select empno,sal from emp

OracleINSTRSUBSTR的用法

                Oracle中INSTR的用法: INSTR方法的格式為INSTR(源字串, 要查詢的字串, 從第幾個字元開始, 要找到第幾個匹配的序號)返回找到的位置,如果找不到則返回0.例如:INSTR('CORPORATE FLOOR','OR', 3, 2)中,源字串為'CORPORA

oracleunionunion all區別與效能分析

[ 概要 ] 經常寫sql的同學可能會用到union和union all這兩個關鍵詞, 可能你知道使用它們可以將兩個查詢的結果集進行合併, 那麼二者有什麼區別呢? 下面我們就簡單的分析下.

oracledistinctcount函式組合使用

oracle中的distinct關鍵字和count函式需要經常組合起來使用 例如,如果我們拿到一個僅有員工基本資訊的列表,我們希望得到這個公司共有多少個部門。 我們可以這樣做: select count(a.deptno) from (select distinct deptno

OracleCatalognocatalog的區別

nocatalog方式:用control file作為catalog,每一次備份都要往控制檔案裡面寫好多備份資訊,控制檔案裡面會有越來越多的備份資訊,即RMAN的備份資訊寫在本地控制檔案裡面。 catalog方式:必須要首先要建立目錄備份資料庫(catalog,也稱知識庫),建立恢復目錄,即資料庫的

Oracle union union all 的簡單使用說明

drop table student; create table student ( id int primary key, name nvarchar2(50) not null, score number not null ); insert into student values(1,'A

oracledistinctgroup by的區別

其實二者沒有什麼可比性,但是對於不包含聚集函式的GROUP BY操作來說,和DISTINCT操作是等價的。不過雖然二者的結果是一樣的,但是二者的執行計劃並不相同。 在Oracle9i中: SQL> SELECT * FROM V$VERSION; BANNER -------

Oracle UNIONUINON ALL的區別,ISAS的區別(簡單介紹,以後逐漸詳細)

UNION :去重,自動排序 UNION ALL :資料不去充,不自動排序 但實際上,我在公工作中還是UNION ALL使用頻率高 ORACLE中IS 和AS在儲

Oracledatetimestamp之間的轉換

前幾天,gf的專案中用到了timestamp型別欄位,轉換了幾次,都報錯,今天有時間,就把date與timestamp型別的轉換做以測試,總結如下: 一、首先說下date和timestamp的不同吧。 大家知道,date型別能夠儲存月,年,日,世紀,時,分和秒,而經常的格式

oracle刪除截斷表

1.truncate table命令       -ddl語句       -無法回退       -能夠刪除表的所有行,同時保持表的定義不變       -比delete語句速度快       -truncate table 表名 2.delete語句      -dml