在ubuntu上重置JDBC和Oracle 11g连接

时间:2014-04-22 10:27:55

标签: oracle oracle11g ubuntu-12.04 ojdbc ora-12170

我有这个奇怪的问题连接JDBC到Oracle 11g。它本周一突然开始发生,没有我或团队意识到的任何设置更改。在Stackoverflow和Oracle论坛中阅读(参见底部的链接)我已经了解到在linux 64bit机器上生成随机字节存在问题。它导致我尝试了几件事,但遗憾的是没有用。以下是我所知道的所有信息的摘要。

奇怪的是我可以使用sqlplus通过终端连接,但不能使用JDBC。

感谢您的任何想法或帮助,

阿米特

我的设置:

OS: Ubuntu 12.04
Java: Both 7 and 6_45 (Issue is the same)
JDBC: Downloaded from the Oracle official site (see further description down)
    Connection behind a Cisco VPN

JDBC-舱单:

odbc7.jar:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 20.12-b01 (Sun Microsystems Inc.)
Implementation-Vendor: Oracle Corporation
Implementation-Title: JDBC
Implementation-Version: 12.1.0.1.0
Repository-Id: JAVAVM_12.1.0.1.0_LINUX.X64_130403
Specification-Vendor: Sun Microsystems Inc.
Specification-Title: JDBC
Specification-Version: 4.0
Main-Class: oracle.jdbc.OracleDriver
sealed: true

Name: oracle/sql/converter/
Sealed: false

Name: oracle/sql/
Sealed: false

Name: oracle/sql/converter_xcharset/
Sealed: false

odbc6.jar:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 20.12-b01 (Sun Microsystems Inc.)
Implementation-Vendor: Oracle Corporation
Implementation-Title: JDBC
Implementation-Version: 12.1.0.1.0
Repository-Id: JAVAVM_12.1.0.1.0_LINUX.X64_130403
Specification-Vendor: Sun Microsystems Inc.
Specification-Title: JDBC
Specification-Version: 4.0
Main-Class: oracle.jdbc.OracleDriver
sealed: true

Name: oracle/sql/converter/
Sealed: false

Name: oracle/sql/
Sealed: false

Name: oracle/sql/converter_xcharset/
Sealed: false

星期五一切都还在运行:

  • 我可以启动我的应用程序并与Oracle DB建立Java连接。
  • 从星期一起我就遇到了这个问题
  • 我的旧电脑(Ubuntu 12.04),即使我把它留在工作状态,我也没有接触过近一个星期也开始出现这个问题。

使用SQLPLUS的终端连接正在运行:

amit @ mymachine:/ usr / lib / oracle $ sqlplus / @ DB_HOST_IP:1521 / DB_NAME

SQL * Plus:2014年4月22日星期二11:35:58发布12.1.0.1.0版本

版权所有(c)1982,2013,Oracle。保留所有权利。

连接到: Oracle Database 11g 11.2.0.3.0版 - 64位生产

SQL>

但是与JDBC的连接失败了:

DriverManager.getConnection(
                    "jdbc:oracle:thin:@//DB_HOST_IP:1521/DB_NAME", username,
                    password);

挂起约20秒并抛出:

ava.sql.SQLRecoverableException: IO Error: Connection reset
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:682)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:711)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:558)
    at java.sql.DriverManager.getConnection(DriverManager.java:582)
    at java.sql.DriverManager.getConnection(DriverManager.java:185)
    at OracleJDBC.main(OracleJDBC.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:168)
    at oracle.net.ns.Packet.receive(Packet.java:311)
    at oracle.net.ns.DataPacket.receive(DataPacket.java:105)
    at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:305)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:249)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:171)
    at oracle.net.ns.NetInputStream.read(NetInputStream.java:89)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123)
    at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79)
    at oracle.jdbc.driver.T4CMAREngineStream.unmarshalUB1(T4CMAREngineStream.java:426)
    at oracle.jdbc.driver.T4C8TTIdty.receive(T4C8TTIdty.java:688)
    at oracle.jdbc.driver.T4C8TTIdty.doRPC(T4C8TTIdty.java:595)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1439)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
    ... 12 more

从服务器的日志:

Fatal NI connect error 12170.

  VERSION INFORMATION:
        TNS for Linux: Version 11.2.0.3.0 - Production
        Oracle Bequeath NT Protocol Adapter for Linux: Version
11.2.0.3.0 - Production
        TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.3.0 - Production
  Time: 22-APR-2014 09:57:45
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12535

TNS-12535: TNS:operation timed out
    ns secondary err code: 12606
    nt main err code: 0
    nt secondary err code: 0
    nt OS err code: 0
  Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=<my.ip.address>)(PORT=42738))

从两个服务器错误的Oracle文档中:

ORA-12535: TNS:operation timed out
Cause: The requested operation could not be completed within the time out period.
Action: Look at the documentation on the secondary errors for possible remedy. See SQLNET.LOG to find secondary error if not provided explicitly. Turn on tracing to gather more information.

ORA-12606: TNS: Application timeout occurred
Cause: A network session did not reach an application-defined stage within the allowed time interval.
Action: This is an error which does not normally appear at the high level. The action to take is application specific, and is detailed in the higher level error description.

我尝试过的解决方案:

  1. 按照下面的Stackoverflow讨论中的建议添加以下系统属性-Djava.security.egd=file:///dev/urandom
  2. 设置rng-tools以帮助&#39; OS的熵发生器。 (见链接)

  3. 以下代码运行时没有产生随机字节数组的问题(无论参数-Djava.security.egd如何:

  4. int a = 10000; while (a-- > 0){ byte[] array = new byte[2048]; new SecureRandom().nextBytes(array); System.out.println(a); }

    上述所有内容似乎都没有改变错误(超时)。

    编辑:新尝试:

    1. 运行我的应用程序我可以识别导致我出现问题的确切查询。这是在读取1-2kb的CLOG列时。
    2. SQL> select secure_params from session_token where id=11065073;&lt; - 查询被卡住了。

      重启客户端

      在这个特定的行中越来越多地更新这个字段我仍然可以读取该字段,如果它的大小是429个字符,但是当我将其增加到587个字符时它又被卡住了。

          SQL>  select length( secure_params) from session_token where id=11065073;
      
          LENGTH(SECURE_PARAMS)
          ---------------------
                            587
      

      SQL> select secure_params from session_token where id=11065073;&lt; - 查询再次陷入困境。

      第4次尝试让我想到这里可能还有一个问题,因为应用程序能够创建初始连接并从数据库中获取一些简短数据,但只有在结果集获得时才会失败有点胖。

      END OF EDIT

      链接:

      Stackoverflow:Oracle JDBC intermittent Connection Issue

      Rng熵发生器:http://www.howtoforge.com/helping-the-random-number-generator-to-gain-enough-entropy-with-rng-tools-debian-lenny

1 个答案:

答案 0 :(得分:2)

ORA-12170表示与数据库侦听器的TCP连接失败。

如果这是一直发生的错误,请检查防火墙和网络ACL。可能是中间人改变了什么?

或者,它可能是影响TCP连接的其他工件,例如IP地址冲突。我自己最近遇到过这个问题,并在http://distracted-it.blogspot.co.nz/2014/04/ora-12170-tnsconnect-timeout-resolved.html

发表了博客文章

希望它有所帮助。