打开报表报数据连接失败

发布时间:  2014-11-06 浏览次数:  619 下载次数:  0
问题描述
     打开报表时,会报错,报连接数据库错误,需要关闭报错对话框,继续重新点击打开,一般需要重复几次才能正常打开,最多的需要打开8次,影响了客户的正常的使用
处理过程
        通过前台的对话框错误,只能够判断大致的错误大类,是无法创建数据库连接。这种Error级别的错误在后台的日志中会报出详细的堆栈信息,看到此错误以后,通过查看报表的后台日志,报错信息如下所示:

2014-10-28 17:36:49,044 [Thread-26158] ERROR [com.huawei.iweb.platform.logging.jdbc.JDBCLogHandler]     - Not able to connect to device - ICDDB
java.sql.SQLException: Io exception: Connection refused(DESCRIPTION=(ERR=1153)(VSNNUM=186647296)(ERROR_STACK=(ERROR=(CODE=1153)(EMFI=4)(ARGS='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.219.100.11)(PORT=1526))(CONNECT_DATA=(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))null))'))(ERROR=(CODE=303)(EMFI=1))))
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
        at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:404)
        at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:468)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:314)
        at com.huawei.iweb.report.util.ExtraConnectionFactory.createConnection(ExtraConnectionFactory.java:133)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:294)
        at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:974)
        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:96)
        at com.huawei.iweb.report.util.DbUtil$PoolMaintainer.getConnection(DbUtil.java:1217)
        at com.huawei.iweb.report.util.DbUtil.getConnection(DbUtil.java:376)
        at com.huawei.iweb.report.util.DbUtil.getConnection(DbUtil.java:416)
        at com.huawei.iweb.report.util.DbUtil$1.createDBConnection(DbUtil.java:1707)
        at com.huawei.iweb.report.util.DbUtil$JDBCTimeOutThread$1.run(DbUtil.java:1791)
        at java.lang.Thread.run(Unknown Source)
    通过以上错误,可以看到是在跟oracle数据库创建连接的时候报的错,通过此日志在去查看oracle的监听后台日志,日志如下所示:
28-OCT-2014 17:36:49 * 1153
TNS-01153: Failed to process string: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.219.100.11)(PORT=1526))(CONNECT_DATA=(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))null))
NL-00303: syntax error in NV string
     可以看到时间都匹配,在数据库的监听日志中也有明显的错误。这种数据库连接的错误,一般有以下几种可能:
1 数据库负载过高,无法接受连接。
2 数据库的可接入的进程设置过小,已达到最大可接入数,无法接受新的连接。
3 监听程序存在异常,无法接受连接。
4 数据库驱动的问题,应用的Jdbc和数据库版本不匹配。
5 应用或者数据库BUG.
       通过以上的思路逐一排查,发现疑点,当前应用的jdbc的版本与oracle数据库的版本不匹配,为了进一步确认,直接联系了研发。
通过和研发的细致沟通,研发确认两点问题:
 1 当前应用的jdbc版本确实很老,后面会尽快更新。
 2 当前客户现场使用的报表版本不支持oracle rac的环境,BIR从eSpace CC v200r001c31spc300版本开始,已经明确不再支持RAC双机。
      通过跟客户沟通,由于更换jdbc包需要研发的测试,花费时间,而且风险较大。但是第二个问题,虽然我们当前是oracle的RAC环境,但是我们可以更改jdbc url,来达到oracle单机的效果,通过将jdbc连接串添加instance_name参数,只连接一个实例,达到了最终的效果。

根因
   根本原因是由于当前的报表版本不支持oracle rac环境,前期实施时,实施方没有注意到这点。
建议与总结
   安装配置的时候,严格按照产品文档来操作,否则会遇到很多莫名其妙的问题。

END