Windows防火墙与Oracle端口开放

Posted by Alei Blog on July 12, 2017

Oracle监听使用1521端口,但这不是全部

Oracle监听网络图

问题

两台Windows服务器。

服务器A上安装了Oracle数据库,服务器B上安装java应用。

服务器B不开防火墙,java与Oracle连接正常。开启防火墙后,java应用访问Oracle不通。

服务器B防火墙放开1521端口,仍然不通。

原因

Oracle监听使用1521端口,客户端程序与监听建立连接之后,监听程序会请求oracle实例,衍生一个新的数据库连接,这个连接使用新的端口,监听程序将新的端口返回给客户端,之后,客户端和数据库实例之间使用这个新的端口通讯。

新的端口是是随机的,或者说根据与连接相关的规则随机的,所以无法在服务器B的防火墙中设置放开某个固定端口来解决这个问题。

解决办法

Windows Socket2规范有一个特性,共享套接字Shared Socket。

共享套接字是指一个进程共享另一个进程的套接字。

如果让Oracle监听程序与数据库服务进程共享套接字,那么连接端口可以都是1521。

如何设置共享套接字

打开服务器A的注册表,在HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0上新建一个键值对:USE_SHARED_SOCKET=true。

如果安装了多个目录,则每个类似的目录都要设置:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx (x目录编号)

设置后要求重新启动实例