在开发中,曾经遇到下面的问题,后向Oracle咨询,得以解决,愿和大家共享
环境
2台Web/Application服务器(Windows2003 server)+1台数据库服务器(oracle9.2),
业务应用系统基于.Net技术。数据库服务器采用Windows2000 Server操作系统。
其中一台Web/Application服务器部署与外网,另外一台Web/Application服务器和数据库服务器部署于内网.外网和内网有防火墙隔开。
问题
外网的应用服务器安装好OracleClient后,防火墙开设端口1551(Oracle监听端口),外网应用服务器程序仍然不能访问数据库。
原因
For windows platform, the listener spawns a thread when accept an incoming SQL*Net connection and it will listen to a random free port other than the listener port. The connection is redirected to different port, so if the firewall just opens a single port it will not work。
解决方案
To workaround this, we can set a Windows registry value USE_SHARED_SOCKET, put this registry key under your ORACLE registry:\HKEY_LOCAL_MACHINESOFTWAREORACLEHOME<#>
Create the key USE_SHARED_SOCKET and assign the value TRUE.
After that you need to restart the Oracle service and also the Oracle listener, then it should work.
One problem of this setting is if your listener is down, all the connections will be cut. This is different than Oracle on Unix platform works.
补充:如果Oracle安装在UNIX平台下面,则防火墙只需要开设一个端口(同Oracle监听端口)