JAVA查询Oracle数据库集群连接字符串

JAVA查询Oracle数据库集群连接字符串

事件: 报表接口数据库突然无法连接 ,导致无法正常取数操作。

异常信息: Io 异常: Got minus one from a read call

分析: 数据库地址及其配置信息都为发生变化 , 经询问后得知数据库调整为集群工作方式 .        

结果:

1. 修改普通 JDBC 连接字符串为集群工作方式。

2. 接口中的 JDBC JAR文件不适合集群工作方式。

思维宽度:          

1. JDBC JAR文件的选择,Classes12 到底是个啥玩意? 第一次听很晕 , 其实就是 oracle 数据库自带的 JDBC ,全名叫 classes12.jar 高手都这么忽悠人的!

常用JDBC JAR信息

Class.forName\JDK、数据库

Jdk1.4

Jdk1.5

Jdk1.6

单例数据库

集群数据库

Class.forName

OracleJdbcDriver9i.jar

支持

支持

支持

支持

不支持

oracle.jdbc.OracleDriver

classes12.jar(oracle 92i)

支持

支持

支持

支持

不支持

oracle.jdbc.OracleDriver

ojdbc14.jar(oracle 92i)

支持

支持

支持

支持

不支持

oracle.jdbc.OracleDriver

classes12.jar(oracle 10G)

支持

支持

支持

支持

支持

oracle.jdbc.OracleDriver

ojdbc14.jar(oracle 10G)

支持

支持

支持

支持

支持

oracle.jdbc.OracleDriver

ojdbc5.jar

不支持

支持

支持

支持

支持

无需 Class.forName 加载

ojdbc6.jar

不支持

不支持

支持

支持

支持

无需 Class.forName 加载

常用JDBC驱动包 JDK 1.4 JDK 1.5 JDK 1.6 单例数据库 集群数据库 Class.forName

1) OracleJdbcDriver9i.jar 支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriver

2) classes12.jar(oracle 92i) 支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriver

3) ojdbc14.jar(oracle 92i) 支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriver

4) classes12.jar(oracle 10G) 支持 支持 支持 支持 支持 oracle.jdbc.OracleDriver

5) ojdbc14.jar(oracle 10G) 支持 支持 支持 支持 支持 oracle.jdbc.OracleDriver

6) ojdbc5.jar 不支持 支持 支持 支持 支持 无需 Class.forName 加载

7) ojdbc6.jar 不支持 不支持 支持 支持 支持 无需 Class.forName 加载

序号1 : OracleJdbcDriver9i.jar 这就是我常用的 JDBC 驱动,本次肇事者 !出身不明 , 户口本 (MANIFEST.MF) 内容为空 ,初步分析为 oracle92i 时代产物。

序号2, 3 : 系出同门 ,都为 oracle92i 自带 ,家庭住址: oracle/jdbc/libclasses12.jar 户口本信息:Specification-Title: "Oracle JDBC driver classes for use with JDK1.2 and JDK1.3"Specification-Version: "Oracle JDBC Driver version - 9.0.2.0.0"ojdbc14.jar 户口本信息:Specification-Title: "Oracle JDBC driver classes for use with JDK1.4"Specification-Version: "Oracle JDBC Driver version - 9.0.2.0.0"

序号4,5 : oracle 10G 的产物 与 oracle 92i 最大的区别在于支持 集群查询。

序号 6,7: ojdbc5.jar 支持 JDK 1.5 ,支持 JDBC 3.0                 ojdbc6.jar 支持 JDK 1.6 ,支持 JDBC 4.0两者无需执行 Class.forName("oracle.jdbc.OracleDriver"); 直接 DriverManager.getConnection( URL, USER, PWD) ; 就OK了。如果项目仅支持 JDK1.4 就不要妄动 , 选择序号 4 ,5 不二的选择 .如果项目支持 JDK1.5 以上 推荐 序号 6 ,7 研究一下新特性。

2. 集群工作方式 连接字符串…慎重选择连接之外的属性。 偷懒粘贴下代码 !

StringBuffer url = new StringBuffer();

url.append("jdbc:oracle:thin:@(description= (address_list =");

url.append("(address=(protocol=tcp)(host=192.168.31.9)(port=1521))");

//根据自己情况继续追加集群信息,格式如下//bf.append("(address=(protocol=tcp)(host=10.37.27.112)(port=1521))");

url.append("(load_balance=yes)");

//load_balance=yes;表示是否负载均衡url.append(")"); //address_list 结束

url.append("(connect_data =");

url.append("(server = dedicated)"); //server = dedicated;表示专用服务器模式,可以去掉url.append("(service_name=wangjj)"); //数据库服务名称url.append("(failover_mode =");url.append("(type=session)");

//TYPE = SESSION表示当一个连接好的会话的实例发生故障,系统会自动将会话切换到其他可用的实例,前台应用无须再度发起连接,但会话正在执行的SQL 需要重新执行url.append("(method=basic)"); //METHOD = BASIC表示初始连接就连接一个接点,彵还有个选项是preconnect,表示初始连接所有的接点url.append("(retries=5)"); //RETRIES 重试次数url.append("(delay=15)");

//DELAY 重试延迟 单位为秒url.append(")");

//failover_mode 结束url.append(")");

//connect_data 结束url.append(")"); //description 结束

 

注意:jdk版本要和JDBC驱动的版本对应

测试代码:

package test;

 

import java.net.ProxySelector;

import java.sql.Connection;

import java.sql.Driver;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

 

/**

 *

 * @author Administrator

 */

public class Main {

 

/** Creates a new instance of Main */

public Main() {

 

try {

Driver driver = (Driver) Class.forName(

"oracle.jdbc.driver.OracleDriver ").newInstance();

DriverManager.registerDriver(driver);

} catch (Exception e) {

}

Connection con = null;

try {

System.out.println("aaaa ");

ProxySelector.setDefault(null);

System.out.println("bbbb ");

con = DriverManager.getConnection(

"jdbc:oracle:thin:@(description=(address_list=(address=(host=10.100.100.65)(protocol=tcp)(port=1521))(address=(host=10.100.100.66)(protocol=tcp)(port=1521))(load_balance=yes)(failover=yes))(connect_data=(service_name=jyzx)))",

"cn", "cn");

// logger.info( "创建数据库连接成功: "+URL);

System.out.println("ssss ");

Statement st = con.createStatement();

System.out.println("dddd ");

ResultSet rs = st.executeQuery("select receivablesOID from Receivables where FLAG=1 and SynchronizationStatus =0");

System.out.println("eeee");

while (rs.next())

System.out.println(rs.getString("receivablesOID"));

System.out.println("ffff ");

} catch (Exception e) {

System.out.println(e);

} finally {

try {

con.close();

} catch (Exception e) {

System.out.println(e);

}

}

}

 

/**

 * @param args

 *            the command line arguments

 */

public static void main(String[] args) {

// TODO code application logic here

new Main();

}

 

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值