真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么理解OracleRAC環(huán)境下的連接管理

本篇內(nèi)容介紹了“怎么理解Oracle RAC環(huán)境下的連接管理”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、武岡網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為武岡等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

Oracle RAC 環(huán)境下的連接管理

所謂“連接管理”,主要體現(xiàn)在 Load Balancing 和 Failover 兩方面。Oracle RAC 11gR2 下的 Load Balancing 和 Failover,根據(jù)是否使用了事先已經(jīng)存在的連接(如連接池中的連接)又分為 Connect Time Load Balancing、Runtime Connection Load Balancing、Connect Time Connection Failover和Runtime Connection Failover 這 4 種類型,凡是帶上了“Runtime”前綴的,就是指連接已經(jīng)存在的情況,比如使用了連接池。

一、首先來介紹 Connect Time Connection Failover

Connect Time Connection Failover 是指不從連接池中取得已有連接,而是直接連接 Oracle 數(shù)據(jù)庫時的 Failover。在 Oracle RAC 11gR2 之前,Connect Time Connection Failover 是非常容易實現(xiàn)的,只需要在相關(guān)的 tnsnames.ora 中指定多個 vip,同時指定 FAILOVER=ON 就好了。如下所示:

(DESCRIPTION=
    (FAILOVER=ON)
    (ADDRESS_LIST=
      (LOAD_BALANCE=OFF)
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC1-vip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC2-vip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC3-vip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC4-vip)(PORT=1521))
    )
    (CONNECT_DATA=(SERVICE_NAME=RAC10g))
  )

這里客戶端進(jìn)程首先會嘗試連接 RAC1-vip,如果連不上,則會嘗試RAC2-vip,再連不上,則會繼續(xù)往下嘗試,直到所有出現(xiàn)在 ADDRESS_LIST 中的 vip 地址全部順序嘗試完為止。這種客戶端在連接 Oracle 數(shù)據(jù)庫時的 Failover,不僅適用于 RAC 環(huán)境,也適用于 Data Guard 環(huán)境。如下所示:

DESCRIPTION=
    (FAILOVER=ON)
    (ADDRESS_LIST=
      (LOAD_BALANCE=OFF)
      (ADDRESS=(PROTOCOL=TCP)(HOST=primary-ip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=standby-ip)(PORT=1521))     
    )
    (CONNECT_DATA=(SERVICE_NAME=service10g))
  )

Oracle RAC 11gR2 引入了 SCAN(Single Client Access Name),并且客戶端缺省是通過 SCAN 來連接整個 RAC 環(huán)境的,如下是 SCAN 的架構(gòu)圖:

怎么理解Oracle RAC環(huán)境下的連接管理

如上圖所示,如果使用了 DNS 或者 GNS (Grid Naming Service),那么最多可以有 3 個 SCAN VIP 和 3 個 SCAN Listener;如果沒有使用 DNS 或者 GNS,而是選擇使用 hosts 文件,則只會有 1 個 SCAN VIP 和 1 個 SCAN Listener。

這里假設(shè)在 tnsnames.ora 中這樣配置:

  (DESCRIPTION = 
    (FAILOVER=ON) 
    (ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521)) 
    (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =RAC11g)))	

嚴(yán)格意義上說,只有在 RAC 環(huán)境有 1 個以上 SCAN VIP 的時候,上述 FAILOVER=ON 才有意義——它表示的是客戶端在連接 SCAN VIP 的時候,如果其中的一個 SCAN VIP 連不上,則馬上會嘗試另外一個 SCAN VIP。

當(dāng)使用了 hosts 文件來指定 SCAN VIP 的時候,即在整個 RAC 環(huán)境只有 1 個 SCAN VIP 的情況下,F(xiàn)ailover 其實也存在,只不過這種情況下 Failover 的速度會慢一些。因為當(dāng) SCAN VIP 所在的節(jié)點宕掉后,SCAN VIP 會和相關(guān)的 SCAN Listener 一起整體 Failover 到其他節(jié)點,只不過這個 Failover 需要時間,而客戶端需要等待這個 Failover 過程完畢后才能重新連上 RAC。

二、接下來介紹 Runtime Connection Failover

Runtime Connection Failover 是指連接已經(jīng)存在的情況下的 Failover。這個已存在的連接,可能是連接池中正在用的連接,也可能是不通過連接池、直接通過 OCI 客戶端(如 sqlplus)連上 Oracle 數(shù)據(jù)庫后的連接。

這種 Runtime Connection Failover,就是指在連接已經(jīng)存在的情況下,如果 Oracle 數(shù)據(jù)庫端出現(xiàn)了異常的情況(比如 Service 宕了、Instance 崩潰了、Session 斷了)而導(dǎo)致已有連接中斷,怎樣 Failover 的問題。

有兩種手段來實現(xiàn) Runtime Connection Failover,分別為 TAF(Transparent Application Failover)和 FCF(Fast Connection Failover)。

首先來介紹 TAF。TAF 有如下一些知識點需要我們注意:

1、它可以在 client 端的 tnsnames.ora 中的連接串里定義,也可以在 server 端的 service 中定義,只不過 service 端的設(shè)置會取代(override)客戶端 tnsnames.ora 中的設(shè)置:

客戶端可以這樣設(shè)置 TAF:

  (DESCRIPTION = 
    (FAILOVER=ON) 
    (ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521)) 
    (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = Email) 
    (FAILOVER_MODE= (TYPE=select)(METHOD=basic)(RETRIES=180)(DELAY=5)))

Server 端可以這樣設(shè)置 TAF:

srvctl modify service -d RAC11g -s Email -q TRUE -P BASIC -e SELECT -z 180 -w 5 -j LONG 具體各個參數(shù)的含義可參見如下注釋:

Usage: srvctl modify service -d  -s  [-c {UNIFORM | 
SINGLETON}] [-P {BASIC|PRECONNECT|NONE}] [-l 
[PRIMARY][,PHYSICAL_STANDBY][,LOGICAL_STANDBY][,SNAPSHOT_STANDBY]] [-y 
{AUTOMATIC | MANUAL}][-q {true|false}] [-x {true|false}] [-j {SHORT|LONG}] [-B 
{NONE|SERVICE_TIME|THROUGHPUT}] [-e {NONE|SESSION|SELECT}] [-m 
{NONE|BASIC}] [-z ] [-w ]
    -d       Unique name for the database
    -s              Service name
    -c {UNIFORM | SINGLETON} Service runs on every active server in the server 
pool hosting this service (UNIFORM) or just one server (SINGLETON)
    -P {NONE | BASIC | PRECONNECT}        TAF policy specification
    -l                 Role of the service (primary, physical_standby, 
logical_standby, snapshot_standby)
    -y               Management policy for the service (AUTOMATIC or MANUAL)
    -e        Failover type (NONE, SESSION, or SELECT)
    -m      Failover method (NONE or BASIC)
    -w              Failover delay
    -z              Failover retries
    -j   Connection Load Balancing Goal (SHORT or LONG). Default is LONG.
    -B      Runtime Load Balancing Goal (SERVICE_TIME, 
THROUGHPUT, or NONE)
    -x   Distributed Transaction Processing (TRUE or FALSE)
    -q  AQ HA notifications 
(TRUE or FALSE)
    -h                       Print usage	

2、當(dāng) TAF 的TYPE 設(shè)置為 select 的時候,單純 select 操作(不包括 select … for update)可以做到“斷點續(xù)傳”,即單純的 select 操作在利用 TAF 實現(xiàn) Failover 后是可以從中斷的地方繼續(xù)往下執(zhí)行的;
3、TAF 對 DML 操作不能做到“斷點續(xù)傳”,即如果一個 transaction 在使用 TAF 實現(xiàn) Failover 后,該 transaction 不能從中斷的地方繼續(xù)執(zhí)行,需要再次從頭開始執(zhí)行;
4、TAF 僅對使用 OCI 連接的客戶端和連接池有效,這里的 OCI 連接可以是在 OCI 連接上的封裝,比如 JDBC-OCI driver 就支持 TAF,但 JDBC thin driver 就不支持 TAF(因為 JDBC thin driver 不是基于 OCI 的)。

接下來,在介紹 FCF(Fast Connection Failover)之前,我們必須要先介紹 FAN(Fast Application Notification)。

FAN 是 Oracle RAC 里的一種消息主動通知機(jī)制。當(dāng) RAC 里出現(xiàn) service down/up,instance down/up,節(jié)點負(fù)載變化時,Oracle 數(shù)據(jù)庫都能通過 FAN events 將這些信息發(fā)布出去,訂閱這些 FAN events 的客戶端在第一時間收到這些 FAN events 后就能做出相應(yīng)的動作來響應(yīng)這些 FAN events。

FAN events 分為兩種,第一種是 FAN HA events,第二種是 LBA events,這里的 LBA 是指 Load Balancing Advisory。

當(dāng) RAC 里出現(xiàn) service down/up、instance down/up 時就會觸發(fā) FAN HA events。FAN HA events 的示例如下所示:

Event 1: FAN event type: instance 
Properties:  version=1.0 service=PROD database=PROD instance=PROD1 host=node1 status=down
 

Event 2: FAN event type: service_member 
Properties:  version=1.0 service=ERP  database=PROD instance=PROD1 host=node1 status=down

Event 3: FAN event type: service_member 
Properties: version=1.0 service=ERP database=PROD instance=PROD3 host=node3 status=up

RAC 里節(jié)點的負(fù)載變化后也會產(chǎn)生 LBA events,LBA events 的示例如下所示:

Event 4: FAN-event type: service_metrics 
Properties: version=2.0 service=ERP database=PROD instance=PROD1 percent=70 
service_quality=GOOD instance=PROD2 percent=30 service_quality=GOOD  

Event 5 :FAN-event type: service_metrics 
Properties: version=2.0 service=CRM database=PROD instance=PROD2 percent=30 
service_quality=GOOD instance=PROD3 percent=70 service_quality=GOOD

上述 FAN events 可能會通過多種渠道傳播出去,這些渠道包括 ONS(Oracle Notification Service),AQ(Advanced Queue),PMON 等。下面是關(guān)于 FAN events 架構(gòu)和傳播途徑的兩張圖,它們就直觀的說明了 FAN events 的傳播途徑:

怎么理解Oracle RAC環(huán)境下的連接管理

訂閱 FAN HA events 的客戶端包括:JDBC Implicit Connection Cache, OCI, ODP.NET Connection Pools, Listener, Server Side Callouts 等;
訂閱 LBA events 的客戶端包括:JDBC Implicit Connection Cache, ODP.NET Connection Pools, Listener,OCI Session Pools 等;

介紹完 FAN,現(xiàn)在可以開始介紹 FCF:FCF 的意思是 Fast Connection Failover,它實際上是客戶端通過訂閱 FAN HA events 來實現(xiàn)的。如下是兩個客戶端通過訂閱 FAN HA events 來實現(xiàn) FCF 的例子:

例一:JDBC Fast Connection Failover (FCF)
這里的 JDBC 連接是指 JDBC thin 連接。因為 JDBC thin 連接不是基于 OCI 的,所以這種情況下的 Runtime Connection Failover 不能使用 TAF,只能用 FCF。并且要做如下幾件事情后才可以正常使用 FCF:
1、把 implicit connection cache 打開;
2、把 FastConnectionFailoverEnabled 打開;
3、最好是直接訂閱遠(yuǎn)程的 ONS(在Oracle 10gR2 之前的版本不能直接訂閱遠(yuǎn)程的 ONS,只能通過在本地安裝 ONS 后來實現(xiàn) FAN events 的中轉(zhuǎn));
4、最好是在 Java 程序里設(shè)置一下 TCP timeout(后面專門會講到在 Oracle 數(shù)據(jù)庫里如何調(diào)整 TCP timeout);

演示代碼如下:

OracleDataSource ods = new OracleDataSource() 
... 
ods.setUser(“Scott”)
ods.setPassword(“tiger”)
ods.setConnectionCachingEnabled(true); 
ods.setFastConnectionFailoverEnabled(true); 
ods.setConnectionCacheName(“MyCache”)
ods.setConnectionCacheProperties(cp); 
ods.setONSConfiguration("nodes=racnode1:6201,racnode2.:6201"); 
ods.setURL("jdbc:oracle:thin:@sales1-scan:1521/oltp");

//TCP connect timeout
Properties prop = new Properties();
prop.setProperty("MinLimit", MIN_CONN);
prop.setProperty("MaxLimit", MAX_CONN);
prop.setProperty("InitialLimit", INIT_CONN);
prop.put (oracle.net.ns.SQLnetDef.TCP_CONNTIMEOUT_STR, "1000")); // 
這里是表示把TCP timeout設(shè)為1000毫秒,即1秒
ods.setConnectionCacheProperties(prop);

例二:ODP.NET Fast Connection Failover (FCF)
對于 ODP.NET 而言,通常做了如下幾件事情后就可以使用 FCF 了:
1、把對應(yīng) service 的 AQ Notification 打開:
srvctl modify service -d RAC11g -s Email -q TRUE
2、把 aq_tm_processes 的值設(shè)為 1;
3、賦予指定用戶 de-queue 的權(quán)限:
exec dbms_aqadm.grant_queue_privilege('DEQUEUE','SYS.SYS$SERVICE_METRICS', );
4、在 .NET 連接串里設(shè)置 HA events=true;

演示代碼如下:

// C# 
using System; 
using Oracle.DataAccess.Client; 
class ConnectionPoolingSample 
{ 
static void Main() 
{ 
OracleConnection con = new OracleConnection(); 
//Open a connection using ConnectionString attributes 
//related to connection pooling. 
con.ConnectionString = 
"User Id=scott;Password=tiger;Data Source=crm;" + 
"Min Pool Size=10;Connection Lifetime=120;Connection Timeout=60;" + 
"HA events=true", "Incr Pool Size=5; Decr Pool Si=2"; 
con.Open(); 
Console.WriteLine("Connection pool successfully created"); 
// Close and Dispose OracleConnection object 
con.Close(); 
con.Dispose(); 
Console.WriteLine("Connection is placed back into the pool."); 
} 
}

FCF 跟 TAF 有一個很大的不同就是即便是單純 select 操作,F(xiàn)CF 也不能像 TAF 那樣做到“斷點續(xù)傳”。對于配置好了 FCF 的連接池而言,當(dāng)它接收到包含 instance/service 宕掉的 FAN HA events 后,原先 cache 在連接池里的跟這個 instance/service 相關(guān)的連接馬上會被標(biāo)記為失效(invalid)同時這些連接會被清除,使用這些連接的 transaction 也會馬上中止并回滾。當(dāng)應(yīng)用捕捉到這個中止的 transaction 所產(chǎn)生的錯誤信息后,要么直接把相關(guān)錯誤返回給最終用戶,要么從連接池中重新取得一個有效連接并重新執(zhí)行這個被中止的 transaction。

在啟用了 FCF 的情況下,如果連接錯誤被返回給了最終用戶,那么應(yīng)該如何判斷錯誤信息的來源呢(即是否是 FCF 返回的錯誤)?很簡單,用 isFatalConnectionError(SQLException e)來判斷一下就好了,演示代碼如下:

try { 
conn = getConnection(); 
//這里取得連接后做相關(guān)的工作
} catch (SQLException e) { 
handleSQLException(e) 
} 
... 
void handleSQLException (SQLException e) 
{ 
if 
(OracleConnectionCacheManager.isFatalConnectionError(e)) 
ConnRetry = true; //這里表示捕捉到FCF返回的錯誤 
…
}

三、接著介紹 Connect Time Load Balancing

Connect Time Load Balancing 就是指不從連接池中取得已有連接,而是直接連接 Oracle 數(shù)據(jù)庫時的 Load Balance。Connect Time Load Balancing 又細(xì)分為兩種,分別是客戶端的 Connect Time Load Balancing 和 Server 端的 Connect Time Load Balancing。

在 Oracle RAC 11gR2 之前,客戶端的 Connect Time Load Balancing 非常容易實現(xiàn),只需要在相關(guān)的 tnsnames.ora 中指定多個 vip,同時指定 LOAD_BALANCE=ON 就好了。如下所示:

(DESCRIPTION=
    (ADDRESS_LIST=
      (LOAD_BALANCE=ON)
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC1-vip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC2-vip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC3-vip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC4-vip)(PORT=1521))
    )
    (CONNECT_DATA=(SERVICE_NAME=RAC10g))
  )

這樣客戶端在連接的時候,會隨機(jī)地從上述 4 個 VIP 地址中選一個來連接 Oracle 數(shù)據(jù)庫以達(dá)到 Load Balance 的目的。

之前已經(jīng)提到,Oracle RAC 11gR2 中引入了 SCAN(Single Client Access Name),并且客戶端缺省是通過 SCAN 來連接整個 RAC 環(huán)境的,如果使用了 DNS 或者 GNS (Grid Naming Service),那么最多可以有 3 個 SCAN VIP 和 3 個 SCAN Listener;如果沒有使用 DNS 或者 GNS,而是選擇使用 hosts 文件,則只會有 1 個 SCAN VIP 和 1 個 SCAN Listener。

這里假設(shè)你在 tnsnames.ora 中這樣配置:

  (DESCRIPTION = 
    (LOAD_BALANCE=ON)
    (ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521)) 
    (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =RAC11g)))	

嚴(yán)格意義上說,只有在 RAC 環(huán)境有 1 個以上 SCAN VIP 的時候,上述 LOAD_BALANCE=ON 才有意義——它表示的是客戶端在連接 Oracle 11gR2 RAC 的時候,會隨機(jī)的選擇三個 SCAN VIP 中的一個來連接,所以 Oracle 11gR2 RAC 的客戶端 Connect Time Load Balancing 實際上是針對 SCAN VIP 而言的,而不是像 Oracle RAC 10gR2 /9iR2 那樣直接針對 RAC 節(jié)點的 VIP(Oracle RAC 9iR2 里沒有 VIP,此時 Connect Time Load Balancing 是針對 public ip)。

當(dāng)使用了 hosts 文件來指定 SCAN VIP 的時候,客戶端 Connect Time Load Balancing 實際上是不存在的,因為現(xiàn)在整個 RAC 環(huán)境只有 1 個 SCAN VIP。

現(xiàn)在再來介紹一下 Server 端的 Connect Time Load Balancing。Server 端的 Connect Time Load Balancing 相對來說要復(fù)雜一些,下面針對 Oracle 數(shù)據(jù)庫不同的版本來分別加以說明。

首先要說明的是:無論是 Oracle RAC 9iR2/10gR2,還是 Oracle RAC 11gR2,它們的 Server 端 Connect Time Load Balancing 都是通過聯(lián)合使用 local_listener 和 remote_listener 來實現(xiàn)的。

先來介紹 Oracle RAC 9iR2 下的 Server 端 Connect Time Load Balancing:
這里假設(shè)是一個 4 節(jié)點的 Oracle RAC 9iR2,tnsnames.ora 中的連接串是如下這樣:

(DESCRIPTION=
    (FAILOVER=ON)
    (ADDRESS_LIST=
      (LOAD_BALANCE=ON)
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC1-ip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC2-ip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC3-ip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC4-ip)(PORT=1521))
    )
    (CONNECT_DATA=(SERVICE_NAME=RAC9i))
  )

再在各個節(jié)點的 tnsnames.ora 中加入如下設(shè)置:

LISTENER_RAC1 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-ip)(PORT = 1521))

LISTENER_RAC2 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-ip)(PORT = 1521))

LISTENER_RAC3 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-ip)(PORT = 1521))

LISTENER_RAC4 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-ip)(PORT = 1521))

LISTENERS_RAC =
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-ip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-ip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-ip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-ip)(PORT = 1521))
  )

然后只需要在初始化參數(shù)文件里加入如下設(shè)置就能實現(xiàn) Server 端 Connect Time Load Balancing 了:

RAC1.local_listener=LISTENER_RAC1
RAC2.local_listener=LISTENER_RAC2
RAC3.local_listener=LISTENER_RAC3
RAC4.local_listener=LISTENER_RAC4
*.remote_listener=LISTENERS_RAC

當(dāng)做了上述設(shè)置后,上述 4 個節(jié)點的 listener 實際上除了知道本節(jié)點負(fù)載的情況之外,同時也知道了其余節(jié)點的負(fù)載情況。所以當(dāng)先經(jīng)過一層客戶端的 Connect Time Load Balancing,比如這里隨機(jī)地連到了第二個節(jié)點上的 listener(即 LISTENER_RAC2)上,當(dāng) LISTENER_RAC2 發(fā)現(xiàn)自身的負(fù)載較高,是有可能把你的連接請求轉(zhuǎn)移(redirect)到其余負(fù)載較低的節(jié)點的 listener 上的——這就是所謂的第二層 Load Balancing,也就是 server 端的 Connect Time Load Balancing。

Oracle RAC 9iR2 里 server 端的 Connect Time Load Balancing 的依據(jù)是各節(jié)點 CPU 的負(fù)載(CPU runqueue-based load)或各節(jié)點所連接的 session 的數(shù)量。我們可以在相應(yīng)節(jié)點的 listener.ora 中通過參數(shù) prefer_least_loaded_node_來控制 Oracle RAC 9iR2 數(shù)據(jù)庫到底采用哪種判斷依據(jù)。prefer_least_loaded_node_ 的默認(rèn)值是 on,意味著 Listener 會把連接轉(zhuǎn)移(redirect)到 CPU 負(fù)載較低的節(jié)點,即這種情況下判斷負(fù)載的依據(jù)是各節(jié)點 CPU 的負(fù)載情況;如果把它設(shè)為 off,則意味著 Listener 在轉(zhuǎn)移(redirect)連接的時候會考慮各個節(jié)點已連接 session 的數(shù)量并且會盡量保證各個節(jié)點所連接 session 數(shù)量的均衡,即這種情況下判斷負(fù)載的依據(jù)是各節(jié)點已連接 session 的數(shù)量。

接著再來看 Oracle RAC 10gR2 下的 Server 端 Connect Time Load Balancing。Oracle RAC 10gR2 里 Server 端 Connect Time Load Balancing 也是通過聯(lián)合使用 local_listener 和 remote_listener 來實現(xiàn)的,只不過 Oracle RAC 10gR2 里引入了 VIP,所以這里 local_listener 和 remote_listener 一定是要監(jiān)聽 VIP,而不是像 Oracle RAC 9iR2 那樣監(jiān)聽 public ip 了。

這里假設(shè)是一個 4 節(jié)點的 Oracle RAC 10gR2,tnsnames.ora 中的連接串是如下所示(注意這里的連接地址已經(jīng)是 VIP 了):

(DESCRIPTION=
    (FAILOVER=ON)
    (ADDRESS_LIST=
      (LOAD_BALANCE=ON)
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC1-vip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC2-vip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC3-vip)(PORT=1521))
      (ADDRESS=(PROTOCOL=TCP)(HOST=RAC4-vip)(PORT=1521))
    )
    (CONNECT_DATA=(SERVICE_NAME=RAC10g))
  )

再在各個節(jié)點的 tnsnames.ora 中加入如下設(shè)置(注意這里監(jiān)聽的已經(jīng)是 VIP了):

LISTENER_RAC1 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-vip)(PORT = 1521))

LISTENER_RAC2 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-vip)(PORT = 1521))

LISTENER_RAC3 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-vip)(PORT = 1521))

LISTENER_RAC4 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-vip)(PORT = 1521))

LISTENERS_RAC =
  (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-vip)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-vip)(PORT = 1521))
  )

然后只需要在初始化參數(shù)文件里加入如下設(shè)置就能實現(xiàn) Server 端 Connect Time Load Balancing 了:

RAC1.local_listener=LISTENER_RAC1
RAC2.local_listener=LISTENER_RAC2
RAC3.local_listener=LISTENER_RAC3
RAC4.local_listener=LISTENER_RAC4
*.remote_listener=LISTENERS_RAC

當(dāng)做了上述設(shè)置后,與 Oracle RAC 9iR2 一樣,也可以實現(xiàn) Server 端 Connect Time Load Balancing。只不過這里判斷負(fù)載的依據(jù)有了變化。(注:如果客戶端不能解析 RAC1-vip 這樣的主機(jī)名,則在連接時很可能報 ORA-12545 錯誤,local_listener 對應(yīng)的 TNS 配置中應(yīng)該使用 VIP 地址,而不要用主機(jī)名,這里寫主機(jī)名只是出于演示的目的)

Oracle 10g 引入了 Service,所以在 Oracle 10g 里,判斷負(fù)載的依據(jù)就跟 Service 綁定在了一起。Oracle RAC 10gR2 里 Server 端 Connect Time Load Balancing 判斷負(fù)載的依據(jù)是由相關(guān) service 的參數(shù) CLB_GOAL 和 GOAL 聯(lián)合來決定的。

Oracle RAC 10gR2 里的負(fù)載可以通過 v$servicemetric 來查看:

SQL> desc v$servicemetric;
Name              Type         Nullable Default Comments 
----------------- ------------ -------- ------- -------- 
BEGIN_TIME        DATE         Y                         
END_TIME          DATE         Y                         
INTSIZE_CSEC      NUMBER       Y                         
GROUP_ID          NUMBER       Y                         
SERVICE_NAME_HASH NUMBER       Y                         
SERVICE_NAME      VARCHAR2(64) Y                         
CTMHASH           NUMBER       Y                         
ELAPSEDPERCALL    NUMBER       Y                         
CPUPERCALL        NUMBER       Y                         
DBTIMEPERCALL     NUMBER       Y                         
CALLSPERSEC       NUMBER       Y                         
DBTIMEPERSEC      NUMBER       Y                         
GOODNESS          NUMBER       Y                         
DELTA             NUMBER       Y                         
FLAGS             NUMBER       Y

其中每個 service 在 v$servicemetric 里會對應(yīng)兩條記錄,一條記錄每5秒采樣一次,另外一條記錄每 60 秒采樣一次。

這里衡量每個 service 的負(fù)載情況,主要是通過 GOODNESS、DELTA和FLAGS 這三列來說明的,如下是它們各自的含義:
GOODNESS 表示這個節(jié)點成為 Server 端 Connect Time Load Balancing 的目標(biāo)節(jié)點的可能性,這個值越高,可能性就越低。即這個 service 在某個節(jié)點上的 GOODNESS 的值越大,則表明這個節(jié)點的負(fù)載越重,這個節(jié)點成為 Server 端 Connect Time Load Balancing 的目標(biāo)節(jié)點的可能性就越低。

DELTA 表示當(dāng)節(jié)點增加了一個額外的 session 后對負(fù)載增加情況的估算。

FLAGS 是一個標(biāo)志位,它的各個值的含義如下:

 0 – all good
 1 – blocked
 2 – crossed threshold
 4 – goodness unknown (usually when no sessions connected)

每個 service 所對應(yīng)的 CLB_GOAL 實際上表示 Client Load Balance Goal,它的值要么為 LONG,要么為 SHORT,默認(rèn)值是 LONG。

LONG 和 SHORT 的區(qū)別是:LONG 是 CLB_GOAL 的缺省值,通常用于那些需要長時間保持的連接,比如一些第三方的連接池或者 SQL*Form 應(yīng)用;而 SHORT 則通常用于那些連接持續(xù)時間較短的應(yīng)用,如果使用了支持訂閱 LBA(Load Balancing Advisory)的連接池,則應(yīng)該把 CLB_GOAL 的值設(shè)為 SHORT。

如果一個 service 的 CLB_GOAL 被設(shè)為 LONG,則意味著衡量這個 service 所在節(jié)點的負(fù)載情況是依據(jù)連接到這個節(jié)點的 session 的數(shù)量,此時與 CLB_GOAL 相對應(yīng)的另外一個參數(shù) GOAL 的設(shè)置將不再生效。

如果你把一個 service 的 CLB_GOAL 設(shè)為 SHORT,則意味著衡量這個 service 的負(fù)載情況是依據(jù) LBA,在根據(jù) LBA 判斷負(fù)載情況時根據(jù)對應(yīng) service 的 GOAL 的設(shè)置的值的不同,又可以細(xì)分為是依據(jù) SERVICE_TIME 還是依據(jù) THROUGHPUT。也就是說,每個 service 所對應(yīng)的 GOAL 實際上表示 LBA GOAL,它的值要么為 THROUGHPUT,要么為 SERVICE_TIME,要么是 NONE,GOAL 的默認(rèn)值是 NONE。即當(dāng)你把 CLB_GOAL 設(shè)為 SHORT 后,這種情況下 Server 端 Connect Time Load Balancing 判斷負(fù)載的依據(jù)就是由 GOAL 的設(shè)置來決定了。

GOAL 所對應(yīng)的三個值 THROUGHPUT、SERVICE_TIME 和 NONE 的區(qū)別是:
THROUGHPUT:表示判斷負(fù)載的依據(jù)是吞吐量(THROUGHPUT),這通常用于那些并發(fā)的 transaction 具有相似的完成時間、相似的完成速率的系統(tǒng),比如在線交易系統(tǒng);
SERVICE_TIME:表示判斷負(fù)載的依據(jù)是響應(yīng)時間(response time),這通常用于那些并發(fā)的 transaction 具有不同的完成時間、不同的完成速率的系統(tǒng),比如在線購物系統(tǒng),不同的人完成一次在線購物,所購買的產(chǎn)品、所耗費的時間可能有很大差異;
NONE:表示不啟用 LBA。

如果再結(jié)合 service 的 CLB_GOAL 和 GOAL,以及 v$servicemetric,就可以歸納出 Oracle RAC 10gR2 里 Server 端 Connect Time Load Balancing 判斷負(fù)載的依據(jù):

1、Oracle RAC 10gR2 里 Server 端 Connect Time Load Balancing 默認(rèn)情況下判斷負(fù)載的依據(jù)是連接到每個節(jié)點的 session 的數(shù)量,即當(dāng) CLB_GOAL 為默認(rèn)值 LONG 的時候,v$servicemetric 的對應(yīng) service 的 GOODNESS=number of connected sessions,DELTA=1,注意此時 LBA 并沒有啟用;
2、Oracle RAC 10gR2 里如果把 service 的 CLB_GOAL 設(shè)為 SHORT,同時把 GOAL 設(shè)為 THROUGHPUT 或 SERVICE_TIME,則意味著 Server 端 Connect Time Load Balancing 判斷節(jié)點負(fù)載的依據(jù)是 LBA。此時如果 GOAL 設(shè)為 THROUGHPUT,則 v$servicemetric 的對應(yīng) service 的 GOODNESS 值是根據(jù) CPUPERCALL 和 DBTIMEPERCALL 來計算;如果 GOAL 設(shè)為 SERVICE_TIME,則 v$servicemetric 的對應(yīng) service 的 GOODNESS 值是根據(jù) CALLSPERSEC 和 DBTIMEPERSEC 來計算。

接下來再看一下 Oracle RAC 11gR2 下的 Server 端 Connect Time Load Balancing:
Oracle RAC 11gR2 下的 Server 端 Connect Time Load Balancing 和 Oracle RAC 10gR2 下的 Server 端 Connect Time Load Balancing 類似,只不過因為 Oracle RAC 11gR2 里引入了 SCAN,所以 Oracle RAC 11gR2 環(huán)境下 remote_listener 應(yīng)設(shè)置為 SCAN:port。

這里假設(shè)是一個 4 節(jié)點的 Oracle RAC 11gR2 環(huán)境,tnsnames.ora 中的連接串是如下這樣:

(DESCRIPTION = 
    (FAILOVER=ON)(LOAD_BALANCE=ON)
    (ADDRESS = (PROTOCOL = TCP)(HOST = MySCAN)(PORT = 1521)) 
    (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =RAC11g)))	

再在各個節(jié)點的 tnsnames.ora 中加入如下設(shè)置(注意這里監(jiān)聽的是各個節(jié)點的 VIP):

LISTENER_RAC1 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC1-vip)(PORT = 1521))

LISTENER_RAC2 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC2-vip)(PORT = 1521))

LISTENER_RAC3 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC3-vip)(PORT = 1521))

LISTENER_RAC4 =
    (ADDRESS = (PROTOCOL = TCP)(HOST = RAC4-vip)(PORT = 1521))	

然后只需要在初始化參數(shù)文件里加入如下設(shè)置就能實現(xiàn) Server 端 Connect Time Load Balancing 了:

RAC1.local_listener=LISTENER_RAC1
RAC2.local_listener=LISTENER_RAC2
RAC3.local_listener=LISTENER_RAC3
RAC4.local_listener=LISTENER_RAC4
*.remote_listener= MySCAN:1521

當(dāng)做了上述設(shè)置后,Oracle 11gR2 RAC 的 Server 端 Connect Time Load Balancing 也就配好了。此時所有的 SCAN Listener 實際上是都知道所有RAC節(jié)點的負(fù)載情況的。當(dāng)先經(jīng)過一層客戶端的 Connect Time Load Balancing,比如這里隨機(jī)的連到了第二個 SCAN VIP 所對應(yīng)的 SCAN Listener 上后,這時候這個 SCAN Listener 會選擇一個實際負(fù)載較低的 RAC 節(jié)點,然后把連接請求轉(zhuǎn)移(redirect)到這個負(fù)載較低的 RAC 節(jié)點的 Local Listener 上——這就是 Oracle RAC 11gR2 的 server 端的 Connect Time Load Balancing。

實際上,local_listener 和 remote_listener 支持復(fù)雜的連接串的寫法。所以,可以在初始化參數(shù)里面直接設(shè)置 local_listener 和 remote_listener,而不需要在 $ORACLE_HOME/network/admin 下的 tnsnames.ora 中做上述設(shè)置。

來看一個兩節(jié)點的 Oracle 11gR2 RAC 的實例。這個環(huán)境中用了 hosts 文件,hosts 文件內(nèi)容如下所示:

10.1.15.64  P550-05-LA 
10.1.15.84  P550-05-LA-vip 
9.2.1.64    P550-05-LA-priv 
10.1.15.65  P550-05-LB 
10.1.15.85  P550-05-LB-vip 
9.2.1.65    P550-05-LB-priv
10.1.15.86  nbsdev-scan

從上述內(nèi)容可以看到,現(xiàn)在節(jié)點 1 的 vip 是 10.1.15.84,節(jié)點 2 的 vip 是 10.1.15.85,整個 RAC 環(huán)境的 SCAN vip 是 10.1.15.86。

先登陸節(jié)點 1,看一下節(jié)點 1 上的 local_listener 和 remote_listener 的設(shè)置: SQL> show parameter instance_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      NBSDEV1

SQL> show parameter local_listener;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string      (DESCRIPTION=(ADDRESS_LIST=
                                                 (ADDRESS=(PROTOCOL=TCP)(HOST=10.1.15.84)(PORT=1522))))

SQL> show parameter remote_listener;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
remote_listener                      string      nbsdev-scan:1522

再登陸節(jié)點 2,看一下節(jié)點 2 上的 local_listener 和 remote_listener 的設(shè)置: SQL> show parameter instance_name;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
instance_name                        string      NBSDEV2

SQL> show parameter local_listener;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string      (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=
                                                 (PROTOCOL=TCP)(HOST=10.1.15.85)(PORT=1522))))

SQL> show parameter remote_listener;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
remote_listener                      string      nbsdev-scan:1522

上述環(huán)境 server 端的 Connect Time Load Balancing 實際上已經(jīng)配置好了,但從如下內(nèi)容可以看到,我們并沒有在 $ORACLE_HOME/network/admin 下的 tnsnames.ora 中配置相關(guān)的 local_listener 和 remote_listener:
ora11g:/nbsdu01/app/oracle/product/11.2/network/admin>cat tnsnames.ora

# tnsnames.ora Network Configuration File: /nbsdu01/app/oracle/product/11.2/network/
admin/tnsnames.ora
# Generated by Oracle configuration tools.

NBSDEV =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = nbsdev-scan)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = NBSDEV)
    )
  )

四、最后來介紹 Runtime Connection Load Balancing

Runtime Connection Load Balancing 是指從連接池中取得已有連接時的 Connection Load Balancing。

之前無論是 Oracle RAC 9iR2/10gR2,還是 Oracle RAC 11gR2,在存在連接池的情況下,單純的 server 端的 Connect Time Load Balancing 并不能保證當(dāng)應(yīng)用需要從連接池里取得一個已有連接的時候,這個連接就指向了節(jié)點負(fù)載較低的那個節(jié)點。因為這個時候應(yīng)用從連接池里取得的連接很可能就是連接池初始化的時候形成的連接,只是反映了連接池初始化那個時間點的各個節(jié)點的負(fù)載情況,而隨著時間的推移,各個節(jié)點的負(fù)載情況可能發(fā)生了很大的變化,所以這種情況下連接池的連接很可能并不是真正的 Load Balance。

實際上 FAN 就是為了解決上述問題而設(shè)計的。能支持 FAN events 的連接池通過訂閱 FAN HA events,就可以保證當(dāng)應(yīng)用需要從連接池里取得一個已有連接的時候,這個連接肯定是有效的連接,不會指向那些 service 宕掉或者 instance 崩潰的節(jié)點(之前已經(jīng)提到過,這是通過 FCF 來實現(xiàn)的:當(dāng)支持 FAN events 的連接池接收到包含 instance/service 宕掉的 FAN HA events 后,原先 cache 在連接池里的跟這個 instance/service 相關(guān)的連接馬上會被標(biāo)記為失效,同時這些連接會被清除);另外一個方面,能支持 FAN events 的連接池通過訂閱 LBA events,就能近乎實時地知道各個 RAC 節(jié)點實際的負(fù)載情況,所以當(dāng)應(yīng)用需要從連接池里取得一個已有連接的時候,連接池就能提供給用戶一個真正的負(fù)載較低的 RAC 節(jié)點,這樣就實現(xiàn)了真正的 Runtime Connection Load Balancing。

現(xiàn)在介紹兩個通過訂閱 LBA events 實現(xiàn) Runtime Connection Load Balancing 的例子。

例三:JDBC Runtime Connection Load Balancing
這里的 JDBC 連接是指 JDBC thin 連接,要實現(xiàn) JDBC Runtime Connection Load Balancing,只需要做如下兩步即可:
1、首先要按照“例一:JDBC Fast Connection Failover (FCF)”里那樣把 JDBC FCF 設(shè)置好;
2、啟用 LBA events:
srvctl modify service -d RAC11g -s Email -B SERVICE_TIME -j SHORT
這里首先把 CLB_GOAL 設(shè)置成了 SHORT,接著把 GOAL 設(shè)置成了 SERVICE_TIME,這兩者缺一不可,CLB_GOAL 和 GOAL 的各個值的詳細(xì)含義已經(jīng)在 Connect Time Load Balancing 里詳細(xì)解釋過,這里不再贅述。

例四:ODP.NET Runtime Connection Load Balancing
ODP.NET的Runtime Connection Load Balancing的 啟用跟“例二:ODP.NET Fast Connection Failover (FCF)”里的步驟類似,只需要做如下 4 步就好,注意這里第 1 步和第 4 步跟“例二:ODP.NET Fast Connection Failover (FCF)”里的相應(yīng)步驟是不一樣的:
1、把對應(yīng) service的AQ Notification 打開,同時設(shè)置 CLB_GOAL和GOAL:
srvctl modify service -d RAC11g -s Email -q TRUE -B SERVICE_TIME -j SHORT
2、把 aq_tm_processes 的值設(shè)為 1;
3、賦予指定用戶 de-queue 的權(quán)限:
exec dbms_aqadm.grant_queue_privilege('DEQUEUE','SYS.SYS$SERVICE_METRICS', );
4、在.NET連接串里設(shè)置 Load Balancing=true,如下所示:

con.ConnectionString =
  "User Id=user_name;Password=password;Data Source=odpapp;" +
  "Min Pool Size=10;Connection Lifetime=120;Connection Timeout=60;" +
  "Load Balancing=true;Incr Pool Size=5;Decr Pool Size=2";

至此我們已經(jīng)詳細(xì)的描述了 RAC 環(huán)境下的連接管理。

作為這篇文章的結(jié)束,最后我們來闡述一下如何在 Oracle 數(shù)據(jù)庫里設(shè)置 TCP timeout。

1、32 位 Windows上Oracle 數(shù)據(jù)庫 11.2.0.1 默認(rèn)的操作系統(tǒng)TNS連接 timeout 的時間大概是 20 秒:

16:27:26 SQL> conn scott/tiger@cuihua112;
	 ERROR:
ORA-12170: TNS: 連接超時

16:27:49 SQL>

這里可以看到,從開始連接到連接超時的間隔時間是 23 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費的時間,可以知道在 32 位 Windows上Oracle 數(shù)據(jù)庫 11.2.0.1 默認(rèn)的操作系統(tǒng)TNS連接 timeout 的時間大概是 20 秒。

2、修改一下 client 端 sqlnet.ora 文件,將 TNS 連接 timeout 時間修改為 5 秒(這是通過設(shè)置 SQLNET.OUTBOUND_CONNECT_TIMEOUT 來實現(xiàn)的):

# sqlnet.ora Network Configuration File: 
C:\app\cuihua\product\11.2.0\dbhome_1\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.

# This file is actually generated by netca. But if customers choose to 
# install "Software Only", this file wont exist and without the native 
# authentication, they will not be able to connect to the database on NT.

SQLNET.AUTHENTICATION_SERVICES= (NTS)
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 5
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

從如下結(jié)果可以看到,從開始連接到連接超時的間隔時間是 7 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費的時間,可以知道上述 5 秒超時的設(shè)置確實生效了。

16:28:34 SQL> conn scott/tiger@cuihua112;

ERROR:
ORA-12170: TNS: 連接超時

16:28:41 SQL>

3、注釋掉上述 SQLNET.OUTBOUND_CONNECT_TIMEOUT = 5,在 tnsnames.ora 的 cuihua112 的連接串中將 TNS 連接 timeout 時間設(shè)置為 15 秒:

CUIHUA112 =
  (DESCRIPTION =
    (CONNECT_TIMEOUT=5)(RETRY_COUNT=2)
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.190.11)(PORT = 1521))
    (CONNECT_DATA =	
      (SERVER = DEDICATED)
      (SERVICE_NAME = cuihua112)
    )
  )

從如下結(jié)果可以看到,從開始連接到連接超時的間隔時間是 17 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費的時間,可以知道上述 15 秒超時的設(shè)置確實生效了。

16:31:08 SQL> conn scott/tiger@cuihua112;

ERROR:
ORA-12170: TNS: 連接超時

16:31:25 SQL>

4、同時啟用 SQLNET.OUTBOUND_CONNECT_TIMEOUT = 5 和上述 cuihua112 的連接串,從結(jié)果里可以看到,tnsnames.ora 中的設(shè)置取代了(override)了 sqlnet.ora 中的 TNS 連接 timeout 的設(shè)置。即在同時啟用的情況下,現(xiàn)在的 TNS 連接 timeout 設(shè)置還是為 15 秒。

16:33:12 SQL> conn scott/tiger@cuihua112;

ERROR:
ORA-12170: TNS: 連接超時

16:33:29 SQL>


這里可以看到,從開始連接到連接超時的間隔時間是 17 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費的時間,可以知道是 15 秒超時的設(shè)置生效了。

5、在 tnsnames.ora 的 cuihua112 的連接串中將 TNS 連接 timeout 時間設(shè)置為 40 秒,這已經(jīng)超過了 TNS 連接默認(rèn)的 timeout 值,從如下測試?yán)锟梢钥吹剑琌racle 數(shù)據(jù)庫會以 tnsnames.ora 中的設(shè)置為準(zhǔn)(當(dāng)然,這里前提條件是單次連接的 CONNECT_TIMEOUT 設(shè)置不要超過操作系統(tǒng) TNS 連接默認(rèn)的 timeout 值,如果超過了則 CONNECT_TIMEOUT 設(shè)置失效,但 RETRY_COUNT 的設(shè)置依然有效)。

CUIHUA112 =
  (DESCRIPTION =
    (CONNECT_TIMEOUT=10)(RETRY_COUNT=3)
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.20.190.11)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cuihua112)
    )
  )	

這里 CONNECT_TIMEOUT 設(shè)置為 10 秒,RETRY_COUNT 設(shè)置為 3,實際上就將 TNS 連接 timeout 時間設(shè)置成了40秒

16:52:52 SQL> conn scott/tiger@cuihua112;

ERROR:
ORA-12170: TNS: 連接超時

16:53:33 SQL>

這里可以看到,從開始連接到連接超時的間隔時間是 41 秒,去掉輸入上述連接串“conn scott/tiger@cuihua112”所耗費的時間,可以知道是 40 秒超時的設(shè)置生效了。

“怎么理解Oracle RAC環(huán)境下的連接管理”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!


本文名稱:怎么理解OracleRAC環(huán)境下的連接管理
文章轉(zhuǎn)載:http://weahome.cn/article/pcieih.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部