目前手头上的一个项目需要连接的数据库是一个双机负载平衡设置的oracle数据库,使用普通的连接字符串jdbc:oracle:thin:@ip:port:SID的形式不能成功连接,必须要使用如下的形式
- jdbc:oracle:thin:@(DESCRIPTION =
- (LOAD_BALANCE = YES)
- (FAILOVER = ON)
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = TCP)(HOST = ip)(PORT = 1521))
- (ADDRESS = (PROTOCOL = TCP)(HOST = ip)(PORT = 1521))
- )
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = servicename)
- )
- )
和单机的tns比较可以发现多出了(LOAD_BALANCE = YES)(FAILOVER = ON)以及(SERVICE_NAME = servicename)这几个值,前面两个不解释(我也不知道什么意思),主要看后面的SERVICE_NAME。
我们连接单机的oracle数据库时,这个值通常都是SID=***的形式。SID是数据库的实例名,SERVICE_NAME是从客户端连接数据库时的别名,它可以对应多个SID(本例中即是如此,更多关于两者的详细资料请自行google)。因此在双机环境当中,我们就需要SERVICE_NAME去连接数据库了。
此外,在使用plsql developer连接该服务时,tns只需要有SERVICE_NAME的值就可以成功连接了,这和JDBC连接稍微有点区别。
实例:
private String url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.112)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.113)(PORT=1521))(LOAD_BALANCE=yes)(FAILOVER=on))(CONNECT_DATA=(SERVICE_NAME=GADB)))";
private String user="GATI";
private String pwd="GATI";
private Connection conn;
Class.forName(driver);
conn=DriverManager.getConnection(url,user,pwd)