原因
Oracle listener 只起一个中介作用,当客户连接它时,它根据配置寻找到相应的数据库实例进程,然后spawned一个新的数据库连接,这个连接端口由listener传递给客户机,此后客户机就不再和打交道了,即使listener停止了工作。这个新的连接端口是不可预知的,因而若只开放1521端口还是会被防火墙阻止。
解决方案
Windows Socket2 规范有一个新的特性,就是Shared Socket, 所谓共享套接字是指一个进程共享另一个进程的套接字(详见MSDN相关参考)。如果让listener与数据库服务进程共享套接字,那么连接端口就不会变化。
措施
在注册表中HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_ORACLE_HOME中建立字符串值USE_SHARED_SOCKET,并设置为TRUE,重启即可。