network listener 只起一個中介作用,當客戶連接它時,它根據配置尋找到相應的數據庫實例進程,然後spawned一個新的數據庫連接,這個連接端口由network listener傳遞給客戶機,此後客戶機就不再和打交道了,即使listener停止了工作。這個新的連接端口是不可預知的,因而會被防火牆阻止。
通過OracleOraDb10g_home1TNSListener生產的端口是隨機的,可以通過netstat -ano進行查看隨機端口。而1521端口是客戶端與數據庫交換的通道。
Windows Socket2 規范有一個新的特性,就是Shared Socket, 所謂共享套接字是指一個進程共享另一個進程的套接字(詳見MSDN相關參考)。如果讓network listener與數據庫服務進程共享套接字,那麼連接端口就不會變化。
如何設置 Shared Socket?在注冊表:HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0上新建一個字符串值:USE_SHARED_SOCKET=true。如果安裝了多個目錄,則每個類似的目錄都要設置:HKEY_LOCAL_MacHINESOFTWAREOracleHOMEx (x目錄編號)設置後要求重新啟動實例(只重啟listener發現沒有效果)