根據這個配置信息,Oracle客戶軟件可以把我們使用的TNS連接串ora10g.localdomain映射到某些有用的信息,也就是主機名、該主機上“監聽器”進程接受(監聽)連接的端口、該主機上所連接數據庫的服務名,等等。服務名表示具有公共屬性、服務級阈值和優先級的應用組。提供服務的實例數量對應用是透明的,每個數據庫實例可以向監聽器注冊,表示要提供多個服務。所以,服務就映射到物理的數據庫實例,並允許DBA為之關聯阈值和優先級。
這個串(ora10g.localdomain)還可以用其他方式來解析。例如,可以使用Oracle Internet目錄(Oracle Internet Directory,OID),這是一個分布式輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP)服務器,其作用就相當於解析主機名的DNS。不過,tnsnames.ora文件通常只適用於大多數小到中型安裝,在這些情況下,這個配置文件的副本不算太多,尚可管理。
既然客戶軟件知道要連接到哪裡,它會與主機名為localhost.localdomain的服務器在端口1521上打開一條TCP/IP socket連接。如果服務器DBA安裝並配置了Oracle Net,並且有一個監聽器在端口1521上監聽連接請求,就會收到這個連接。在網絡環境中,我們會在服務器上運行一個稱為TNS監聽器的進程。就是這個監聽器進程能讓我們與數據庫物理連接。當它收到入站連接請求時,它會使用自己的配置文件檢查這個請求,可能會拒絕請求(例如,因為沒有這樣的數據庫,或者可能我們的IP地址受到限制,不允許連接這個主機),也可能會接受請求,並真正建立連接。
如果建立一條專用服務器連接,監聽器進程就會為我們創建一個專用服務器。在UNIX上,這是通過fork()和exec()系統調用做到的(在UNIX中,要在初始化之後創建新進程,惟一的辦法就是通過fork())。這個新的專用服務器進程繼承了監聽器建立的連接,現在就與數據庫物理地連接上了。在Windows上,監聽器進程請求數據庫進程為連接創建一個新線程。一旦創建了這個線程,客戶就會“重定向”到該線程,相應地就能建立物理連接。圖2-4顯示了UNIX上的監聽器進程和專用服務器連接。
圖2-4 監聽器進程和專用服務器連接
另一方面,如果我們發出共享服務器連接請求,監聽器的表現則會有所不同。監聽器進程知道實例中運行了哪些調度器。接收到連接請求後,監聽器會從可用的調度器池中選擇一個調度器進程。監聽器會向客戶返回連接信息,其中說明了客戶如何與調度器進程連接;如果可能的話,還可以把連接“轉發”給調度器進程(這依賴於不同的操作系統和數據庫版本,不過實際效果是一樣的)。監聽器發回連接信息後,它的工作就結束了,因為監聽器一直在特定主機的特定端口上運行(主機名和端口號大家都知道),而調度器會在服務器上隨意指派的端口上接受連接。監聽器要知道調度器指定的這些隨機端口號,並為我們選擇一個調度器。客戶再與監聽器斷開連接,並與調度器直接連接。現在就與數據庫有了一個物理連接。這個過程如圖2-5所示。
圖2-5 監聽器進程和共享服務器連接
BPingURL">