We have a pair of Oracle servers which are set up as nodes in a cluster (apologies if my terminology is way off). In my tnsnames.ora
file, we have an entry that looks like
EXAMPLE.GOV =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.4)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 1.2.3.5)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = example.gov)
)
)
and this works when I connect with programs which use the tnsnames.ora
file. However, I also have a Java program which uses the oracle.jdbc.pool.OracleDataSource class to establish a connection
public static Connection connect() throws Exception {
OracleDataSource ods = new OracleDataSource();
ods.setDriverType("thin");
ods.setServerName("1.2.3.4");
ods.setDatabaseName("example");
ods.setPortNumber(1521);
ods.setUser("scott");
ods.setPassword("tiger");
return ods.getConnection();
}
which just connects to one of the nodes directly. I'd like to instead use the load-balancing tnsnames.ora
approach, where it uses load balancing or whatever to connect to either one of the nodes, so that if one of them is down then it'll automatically connect to the other.
Since I only have two nodes, I could easily just try opening a connection to the first node, then if that doesn't work open a connection to the second one. However, I'm wondering if there's a more correct way to do this.
I see that there's a setTNSEntryName
parameter, but since my tnsnames.ora
is in a nonstandard place, I'd need to set the TNS_ADMIN
environment variable, which I'm not sure that I can even do from within Java. Nor am I certain that this would work in any case.
Does anyone know how to connect to a cluster of Oracle nodes from a Java program?
For Oracle JDBC thin driver I think this could work as the connection url:
jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.4) (PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=1.2.3.5) (PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=example.gov)))
Use the method setUrl to set the url. If URL is set all other properties like databasename, servername, portNumber, network protocol, tnsentry, and driver type will be ignored.
Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With