千家信息网

TAF(scan+dataguard) JDBC数据源连接排错

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,环境:RAC+dataguardweblogic 10.3.6JDBC连数据库配置:jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOS
千家信息网最后更新 2026年11月01日TAF(scan+dataguard) JDBC数据源连接排错

环境:RAC+dataguard weblogic 10.3.6
JDBC连数据库配置:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=XX.XX.XX.xx)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=XX.XX.xx.xx)(PORT=1521))(LOAD_BALANCE=no)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=TCIS)(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=180)(DELAY=5))))

起因:
客户搬机房,搬完后,测试一切正常,离开现场后过了几天说连接数据库不正常,经常报数据库只读或正处于打开状态;

[com.primeton.das.entity.impl.hibernate.util.JDBCExceptionReporter:77] ORA-16000: 打开数据库以进行只读访问
测试scan地址OK,ping ok;网络工程师说了,网络没问题;
排查:
根据错误,很明显连到备库了;至于为啥连到备库(根据字符串,主库只有连不上,才会连备库,而检查主库是可用的,各种check就不再阐述了),那就奇怪了。
1 问题的不可再现性,决定了
a)你要么用人干这活,一天到晚守着那,等终于逮着的那一刻;
b)写个程序一天到晚守着那,去抓个日志;看一看,或许程序诚不欺你;
最近运气不好,接连碰着各种炸库,选B吧,开始造程序:
语言:JAVA JDK1.6即可
编辑器:记事本++(很low的,干这事用eclipse不敢);
代码:最基本的JAVA类库,加ojdbc6.jar(记得用11g以后的)
想法:要有个程序不停的连数据库,然后连得上写下时间,连的是哪个实例,连不上也得写下日志,当时的时间,最好带上网络的Ping,怀疑网络,但人家说没问题,你也不能死赖是吧;
编码:
用到的包:

import javax.swing. ;
import java.awt.
;
import java.awt.event.;
import java.sql.
;
import java.util.;
import java.io.
;
import java.net.InetAddress;
import java.text.SimpleDateFormat;

定义一个参数文件,要有IP,要有超时时限,要有日志文件输出地址;
tbname.properties:

//定义导出的csv文件,注意要手动建立目录pname=test.csv//定义SCAN连接地址ipaddr=XX.XX.XX.XXtimeout=3000

读取办法:

try{ Properties ps=new Properties(); FileInputStream fis= new FileInputStream("tbname.properties"); ps.load(fis); fis.close(); pathname=ps.getProperty("pname"); ipaddress=ps.getProperty("ipaddr"); timeOut= Integer.parseInt(ps.getProperty("timeout")); System.out.println("写入路径"+pathname+"\t"+"连接SCAN地址:"+ipaddress); }catch (IOException e) { System.out.println(e.getLocalizedMessage());

}

定义数据库连接配置文件:oracle.properties,要有连接字符串,要有用户名/密码

db_url=jdbc:oracle:thin:@(description=(address_list= (address=(host=xx.xx.xx.xx) (protocol=tcp)(port=1521)) (load_balance=NO)(failover=yes))(connect_data=(service_name=orcl)))
#db_url=jdbc:jtds:sqlserver://127.0.0.1:1433/ccxe
username=test
password=test

相关方法:

public Connection getConnection() throws ClassNotFoundException,IOException,
SQLException {
Properties ps=new Properties();
FileInputStream fis= new FileInputStream("oracle.properties");
ps.load(fis);
fis.close();
String url=ps.getProperty("db_url");
String user=ps.getProperty("username");
String pwd=ps.getProperty("password");
String driver = "oracle.jdbc.driver.OracleDriver";
Class.forName(driver);
return DriverManager.getConnection(url, user, pwd);
}

自定义的SQL语句,我这里比较恶心做了图形化,文本框:

public void createUI(){
JFrame jf=new JFrame("数据导出工具csv");
Container c=jf.getContentPane();
c.setLayout(new FlowLayout(FlowLayout.LEFT,30,30));
//定义图标
ImageIcon ii=new ImageIcon("main.gif");
Image image=ii.getImage();
JPanel panel =new JPanel();
jf.setIconImage(image);
textAreaOutput = new JTextArea("select instance_name from v$instance", 6, 10);
textAreaOutput.setSelectedTextColor(Color.RED);
textAreaOutput.setLineWrap(true); //激活自动换行功能
textAreaOutput.setWrapStyleWord(true); // 激活断行不断字功能
jf.setExtendedState(JFrame.ICONIFIED);
//选择数据库类型
ButtonGroup bg=new ButtonGroup();
JRadioButton sqlbutton=new JRadioButton("Sqlserver");
JRadioButton orabutton=new JRadioButton("oracle");
bg.add(sqlbutton);
bg.add(orabutton);
button=new JButton("测试");
JButton prebutton=new JButton("预览");
button.addActionListener(this);
sqlbutton.addActionListener(this);
orabutton.addActionListener(this);
prebutton.addActionListener(this);
//控制窗口初始化大小
jf.setSize(600,200);
//jf.setLocation(400,200);
c.add(textAreaOutput);
c.add(sqlbutton);
c.add(orabutton);
c.add(button);
c.add(prebutton);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}

定义ping功能,用最简单的:

public static boolean ping(String ipAddress,int timeOut) throws Exception {
// 当返回值是true时,说明host是可用的,false则不可。
boolean status = InetAddress.getByName(ipAddress).isReachable(timeOut);
return status;
}

这个虽简单,但容易有bug,已知的如下:
JDK-5061568 : java.net.InetAddress.isReachable() kills Windows networking文章说这个bug会一直重现(This bug can be reproduced always.)
http://bugs.java.com/view_bug.do?bug_id=5061568
JDK-5061571 : InetAddress#isReachable does not send PINGs but only TCP echos
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=5061571
JDK-6595834 : InetAddress.isReachable is not thread safe when using ICMP ECHO.
http://bugs.java.com/view_bug.do?bug_id=6595834
但我这里用着挺好,就略过吧;
打印错误日志,这里需要注意下的就是这个date,在java.sql,java.util里都有,如果不指明,会报错:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
OutputStreamWriter err_log=new OutputStreamWriter(new         FileOutputStream("err.log",true),"GBK");
java.util.Date s_date= new java.util.Date();
err_log.write(df.format(s_date)+"\t"+e.getMessage());
err_log.flush();
err_log.close();
剩下就是javac xxxx.java,
set classpath=%classpath%;.;.\ojdbc6.jar;.\sqljdbc4.jar;
java CsvExportTable

然后

界面比较丑,能用即可;点个测试就开始连了,把正常的日志打到一个文件,错误的打err.log里;

让程序跑了一天,拿出日志一看,真有连不上的时候;连到备库去了,并且连得上的时候只连第一个节点;
而程序ping主机真是通的,看来维护人员确实没忽悠,各种检查数据库,没发现啥有价值的,继续打开程序跑着,让同事看了;一会发现确实有时联不上了,赶紧手动测试,ping 主机通,用vip地址通,telnet  scan主机 1521,不通,telnet vip 1521通,有鬼了,联系网络人员,表示很无趣,说没有限制.

理一下思路:
1 数据库SCAN地址时连得上,时连不上;日志上证明数据库是好的;问题还是出在IP上;
2 网络所处同一网断,确实没有做任何限制,一再证明没有挖坑;
3 ping的结果表示,IP连接确实没有断过;

综合来看,和一个网络现象很象,ARP欺骗。
继续测试:
当连不上,ping 通,telnet scan port 发现居然不通,而连得上时,telnet通的,
arp -d
检查arp,发现两次的MAC地址不一样;难道真是ARP欺骗,很兴奋哈,一个邮件捅到网络室,问题似乎解决了;
但是,但是,管理员查了下MAC地址,此MAC地址是第二节点的-_-,也就是说两个主机有同样的MAC地址,oracle把我们都坑了; 
检查两个主机的IP,确实都有SCAN地址,当场直接无语,上MOS吧,这种问题。。。。。。。
关键字:duplicate scan vip on two node搜索,还真有:
Duplicate SCAN VIP after recovering public LAN problem on Windows 2012 R2 (文档 ID 2030432.1)
临时解决办法:
netsh interface ip delete address name="" addr=xx.xx.xx.xx

数据 地址 数据库 网络 日志 程序 问题 测试 主机 文件 检查 功能 错误 一天到晚 两个 人员 办法 字符 字符串 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北九亚互联网络科技有限公司 河南云网互联网络科技有限公司 科技互联网项目 互联网络科技有限公司 互联网 的科技创新 极限挑战互联网科技 科技创新互联网企业 撒么互联网科技公司 移动互联网科技股 互联网对科技的发展 阿大互联网科技有限公司 互联网科技和信息 乌苏新华互联网科技做什么的 互联网行业科技股 卓翼科技产业互联网合作 互联网领先科技宣传片 互联网科技股为什么大涨 陕西云淼互联网科技公司 广州三三互联网科技有限公司 亚光科技低轨卫星互联网 有木互联网科技 互联网科技热点资讯 移动互联网科技股 科技赋能视角下互联网保险发展 伊宁互联网科技做什么的 风投北京互联网科技 半导体行业属于互联网高科技类吗 南京一网一红互联网科技有限公司 互联网科技职业技能培训学校 平安好医生打造互联网科技医疗
0