为新手问题道歉,但那是我 - 甲骨文的新手。
我的客户端和oracle服务器被防火墙隔开。可以通过此防火墙路由一组有限的IP地址。一个可路由的IP是SCAN侦听器的地址,它会重定向到具有不可路由IP的oracle服务器。
我能够将SQL Developer连接到我的数据库,但不是简单的ODP.Net客户端。
使用wireshark,我看到当SQL Developer连接到SCAN侦听器时,SCAN会回复重定向到SCAN IP上的随机端口,它可能会代理到实际的Oracle服务器。 Wireshark透露,当ODP.Net尝试连接时,SCAN会回复重定向到后端服务器的实际IP,哪些IP不可路由。
我正在寻找有关如何让ODP.Net享受SCAN为SQL Developer提供的行为的建议。
为了简单起见,我尝试使用相同的连接字符串,完全绕过tnsnames.ora。在SQL Developer中,我使用IP地址,端口和服务名称配置了连接。然后我使用wireshark来观察SQL Developer发送到服务器的连接字符串(是的,SQL Dev重复了CID部分):
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=10.130.X.Y)(PORT=1521))
(CONNECT_DATA=
(CID=(PROGRAM=SQL Developer)(HOST=__jdbc__)(USER=myusername))
(SERVICE_NAME=myservice)
(CID=(PROGRAM=SQL Developer)(HOST=__jdbc__)(USER=myusername))))
我将此相同的连接字符串插入OracleConnection
var bldr = new Oracle.DataAccess.Client.OracleConnectionStringBuilder();
bldr.DataSource = @"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.130.X.Y)(PORT=1521))(CONNECT_DATA=(CID=(PROGRAM=SQL Developer)(HOST=__jdbc__)(USER=myusername))(SERVICE_NAME=myservice)(CID=(PROGRAM=SQL Developer)(HOST=__jdbc__)(USER=myuser))))";
var connection = new Oracle.DataAccess.Client.OracleConnection(bldr.ConnectionString);
connection.Open();
connection.Close();
而不是连接我收到超时。对捕获的数据包的进一步检查揭示了上面详述的行为:SCAN充当SQL Developer的代理,但不是ODP的代理。