理解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正忙,那就得一樣地等。