1. 程式人生 > >java.sql.SQLException: Io : NL Exception was generated錯誤解決(jdbc資料來源問題)

java.sql.SQLException: Io : NL Exception was generated錯誤解決(jdbc資料來源問題)

錯誤資訊:

-------------in sendHeartBeats
-------------in sendHeartBeats
2014-03-24 17:37:51,456 ERROR (com.ylkj.drmt.importer.IndicatorDimensionCompostionImporter:226) - T_JJ_YYJC_JJAQJMjava.sql.SQLException: Io : NL Exception was generated
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
        at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
        at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:420)
        at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
        at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
        at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
        at java.sql.DriverManager.getConnection(DriverManager.java:525)
        at java.sql.DriverManager.getConnection(DriverManager.java:171)
        at com.ylkj.drmt.dataquality.detaildata.service.impl.JoinCheckServiceImpl.getStatNum(JoinCheckServiceImpl.java:64)
        at com.ylkj.drmt.dataquality.detaildata.service.impl.JoinCheckServiceImpl.addJoinValidate(JoinCheckServiceImpl.java:203)
        at com.ylkj.drmt.dataquality.detaildata.service.impl.JoinCheckServiceImpl$$FastClassByCGLIB$$cbd107bc.invoke(<generated>)
        at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
        at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
        at com.ylkj.drmt.dataquality.detaildata.service.impl.JoinCheckServiceImpl$$EnhancerByCGLIB$$f685b5ea.addJoinValidate(<generated>)
        at com.ylkj.drmt.dataquality.detaildata.validate.engine.IdvalidateEngine.joinValidate(IdvalidateEngine.java:112)
        at com.ylkj.drmt.dataquality.detaildata.validate.engine.DvalidateEngine$1.processor(DvalidateEngine.java:80)
        at com.ylkj.drmt.dataquality.detaildata.validate.engine.IdvalidateEngine.run(IdvalidateEngine.java:126)
        at java.lang.Thread.run(Thread.java:595)
-------------in sendHeartBeats
-------------in sendHeartBeats


分析解決:

RAC的配置如下:


node1:ip地址192.168.60.132,例項名:rac1,主機名:rac1

node2:ip地址192.168.60.144,例項名:rac2,主機名:rac2

RAC服務名為oratest
我的應用伺服器為apache+weblogic

配置過程如下

1、搜尋了一下,發現提供的連線RAC方法很多,拷貝瞭如下的jdbcURL:     

jdbc:oracle:thin:@(description=(address_list= (address=(host=192.168.60.132) (protocol=tcp)(port=1521))(address=(host=192.168.60.144)(protocol=tcp) (port=1521)) (load_balance=yes)(failover=yes))(connect_data=(service_name= oratest)))


但是weblogic報出如下錯誤:
Io 異常: NL Exception was generated;

2、又從網上google、baidu一番,雖然找到n方法,但就是連不上,總是提示這個錯誤;

3、無奈之中,開啟資料庫tnsname.ora,發現其中的配置如下:
 oratest=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac2)(PORT = 1521))
      (LOAD_BALANCE = yes)

    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = oratest)
    )
  )
於是將jdbcUR修改成:
jdbc:oracle:thin:@(description=(address_list= (address=(host=rac1) (protocol=tcp)(port=1521))(address=(host=rac2)(protocol=tcp) (port=1521)) (load_balance=yes)(failover=yes))(connect_data=(service_name= oratest)))

測試一下,結果竟然成功了;
初步認為是:資料庫服務採用主機名,而在jdbcURL中採用ip地址的方式就會出現NL Exception的問題;

建議:對於連線RAC有問題的情況,最好使用tnsnames.ora中連線字串進行連線;

 不知道大家有沒有遇到這樣的問題?