理解oracle中連接和會話


理解oracle中連接和會話

1.  概念不同:概念不同:

連接是指物理的網絡連接。

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

2.   關系是多對多:

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

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

3.      概念應用:概念應用:

l        oracle的sessions參數決定的是會話數而不是物理連接數。

l        oracle的臨時表中的數據是各會話間隔離的,而與連接概念無關。

l        jdbc的connection,對oracle是一個會話的概念。

4.    實際應用:

連接池,為了提高數據庫交互效率,一般驅動程序都有連接池概念的實現。

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

一種譯為隱式連接緩沖

OracleDataSource ods = new OracleDataSource(); 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 = new java.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.sessions【oracle參數】。每次close()並不關閉實際的會話,而是返回連接緩沖中,供另一個getconnection()使用。所以可以得知,如果一個getconnection()中給某一個會話級臨時表插入數據,然后close(),那么之后如果這個會話被重新得到,是可以看到插入的數據的。

一種譯為OCI連接池。

OracleOCIConnectionPool ods = new OracleOCIConnectionPool();

            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 = new java.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()時將根據配置初始化連接,並在每一個連接上建立一個會話。注意,連接上一旦建立了一個會話,這個連接將還可以再建會話。那么在此時,會任取一個建完會話的物理連接再建一個會話返回。當然這時也要受限於sessions設置。對於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正忙,那就得一樣地等。

轉摘自http://www.cnblogs.com/rootq/articles/1297395.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM