理解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
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