1、JAVA 查询 Oracle 数据库集群连接字符串事件: 报表接口数据库突然无法连接 ,导致无法正常取数操作。 异常信息: Io 异常: Got minus one from a read call分析: 数据库地址及其配置信息都为发生变化 , 经询问后得知数据库调整为集群工作方式 . 结果: 1. 修改普通 JDBC 连接字符串为集群工作方式。2. 接口中的 JDBC JAR 文件不适合集群工作方式。思维宽度: 1. JDBC JAR 文件的选择,Classes12 到底是个啥玩意? 第一次听很晕 , 其实就是 oracle 数据库自带的 JDBC ,全名叫 classes12.jar 高手
2、都这么忽悠人的!常用 JDBC JAR 信息Class.forNameJDK、数据库Jdk1.4 Jdk1.5 Jdk1.6 单例数据库集群数据库Class.forNameOracleJdbcDriver9i.jar支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriverclasses12.jar(oracle 92i)支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriverojdbc14.jar(oracle 92i)支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriverclasses12.jar(oracle 10G
3、)支持 支持 支持 支持 支持 oracle.jdbc.OracleDriverojdbc14.jar(oracle 10G)支持 支持 支持 支持 支持 oracle.jdbc.OracleDriverojdbc5.jar 不支持 支持 支持 支持 支持 无需 Class.forName 加载ojdbc6.jar 不支持 不支持 支持 支持 支持 无需 Class.forName 加载常用 JDBC 驱动包 JDK 1.4 JDK 1.5 JDK 1.6 单例数据库 集群数据库 Class.forName1) OracleJdbcDriver9i.jar 支持 支持 支持 支持 不支持 or
4、acle.jdbc.OracleDriver2) classes12.jar(oracle 92i) 支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriver3) ojdbc14.jar(oracle 92i) 支持 支持 支持 支持 不支持 oracle.jdbc.OracleDriver4) classes12.jar(oracle 10G) 支持 支持 支持 支持 支持 oracle.jdbc.OracleDriver5) ojdbc14.jar(oracle 10G) 支持 支持 支持 支持 支持 oracle.jdbc.OracleDriver6) ojdbc
5、5.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 J
6、DBC 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
7、最大的区别在于支持 集群查询。序号 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. 集群工作方式 连接字符串慎重选择连接之外的
8、属性。 偷懒粘贴下代码 !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)“)
9、; /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 表示当一个连接好的会话的实例发生
10、故障,系统会自动将会话切换到其他可用的实例,前台应用无须再度发起连接,但会话正在执行的 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
11、.append(“)“); /description 结束注意:jdk 版本要和 JDBC 驱动的版本对应测试代码:package test;import .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 M
12、ain */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 = DriverMana
13、ger.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.print
14、ln(“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 herenew Main();