Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle JDBC间歇性连接问题_Java_Oracle_Jdbc - Fatal编程技术网

Java Oracle JDBC间歇性连接问题

Java Oracle JDBC间歇性连接问题,java,oracle,jdbc,Java,Oracle,Jdbc,我遇到了一个非常奇怪的问题 这是连接到Oracle数据库的JDBC的一个非常简单的用法 OS: Ubuntu Java Version: 1.5.0_16-b02 1.6.0_17-b04 Database: Oracle 11g Release 11.1.0.6.0 当我使用jar文件时 OJDBC14.jar它每次都连接到数据库 当我使用jar文件时 OJDBC5.jar它有时连接,有时抛出错误(如下所示) 如果我用Java6重新编译并使用 OJDBC6.j

我遇到了一个非常奇怪的问题 这是连接到Oracle数据库的JDBC的一个非常简单的用法

OS: Ubuntu
Java Version:  1.5.0_16-b02
               1.6.0_17-b04
Database: Oracle 11g Release 11.1.0.6.0
当我使用jar文件时
OJDBC14.jar
它每次都连接到数据库 当我使用jar文件时
OJDBC5.jar
它有时连接,有时抛出错误(如下所示) 如果我用Java6重新编译并使用
OJDBC6.jar
我得到的结果与
OJDBC5.jar

我需要JODB5.jar中的特定功能,这些功能在OJDBC14.jar中不可用

有什么想法吗

错误

> Connecting to oracle
    java.sql.SQLException: Io exception: Connection reset
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:74)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:110)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:171)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:227)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:494)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:411)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:490)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:202)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:474)
    at java.sql.DriverManager.getConnection(DriverManager.java:525)
    at java.sql.DriverManager.getConnection(DriverManager.java:171)
    at TestConnect.main(TestConnect.java:13)

很难说,但是如果我检查JDBC驱动程序的实际版本。确保它是11.1.0.6

Oracle在文件名中不包含数据库版本。因此,11.2的驱动程序与11.1-ojdbc5.jar的驱动程序的名称完全相同。我将提取驱动程序jar文件,并找到MANIFEST.MF文件,这将包含一些版本信息。确保JDBC驱动程序的版本与数据库的版本匹配。我怀疑这可能是版本问题,因为Oracle的11.1.0.6页面上没有名为ojdbc14.jar的jar文件

如果版本匹配-我没主意了:)

一条“连接重置”错误消息通常意味着另一方在尝试创建连接(握手)时中止了连接。这有很多可能的原因。JDBC驱动程序中存在错误、数据库端超时、数据库重启、数据库连接不足、网络质量差、virusscanner/firewall/proxy不好等


由于它是间歇性发生的,JDBC驱动程序中的错误可以被或多或少地排除。留下了剩下的可能原因。我建议首先查看数据库服务器的日志

我也面临着同样的问题。在Windows Vista中,我无法重现这个问题,但在Ubuntu上,我不断地重现“连接重置”错误

我发现

该论坛的一位用户表示:

我在甲骨文公司开了一张罚单,这是他们告诉我的

SecureRandom是sun提供的标准API。在…之间 这个类提供的各种方法void nextBytes(byte[])就是其中之一。 此方法用于生成随机字节。Oracle11gJDBC 驱动程序在登录时使用此API生成随机数。使用者 使用Linux时遇到SQLException(“Io异常: 连接重置”)

问题有两个方面

  • 当SecureRandom.nextBytes(字节[])为空时,JVM尝试列出/tmp(或由-Djava.io.tmpdir设置的备用tmp目录)中的所有文件 被调用。如果文件数量很大,则该方法需要很长时间 响应时间,从而导致服务器超时

  • void nextBytes(byte[])方法在Linux和一些缺少生成硬件的随机数的机器上使用/dev/random 操作速度减慢到使整个登录过程停止的程度 停止。最终用户会遇到SQLException(“Io 例外情况:连接重置)

  • 如果底层操作系统 是在有故障的硬件上运行的Linux

    原因这一原因尚未确切确定。它可以 要么是硬件有问题,要么是由于某种原因 软件无法从dev/random中读取数据

    解决方案更改应用程序的设置,以便添加下一个 java命令的参数:


    -Djava.security.egd=文件:/dev/。/dev/uradom

    我们在java.security文件中做了这个更改,它已经被删除了 错误


    这解决了我的问题

    一些OTN论坛()提供了解决此问题的方法。但是,问题的根本原因没有得到解释。以下是我试图解释问题的根本原因

    Oracle JDBC驱动程序以安全的方式与Oracle服务器通信。驱动程序使用java.security.SecureRandom类收集熵以确保通信安全。此类依赖于本机平台支持来收集熵

    是由操作系统或应用程序收集/生成的随机性,用于加密或其他需要随机数据的用途。这种随机性通常是从硬件源收集的,或者是从硬件噪声、音频数据、鼠标移动或是专门提供的随机性生成器。内核收集熵并将其存储为熵池,并通过特殊文件/dev/random/dev/urandom将随机字符数据提供给操作系统进程或应用程序

    /dev/random读取数据会消耗熵池中请求的位/字节量,从而提供加密操作中通常需要的高度随机性。在这种情况下,如果熵池完全耗尽,并且没有足够的熵可用,则在收集额外的熵之前,对/dev/random块执行读取操作。因此,从/dev/random读取的应用程序可能会阻塞一段随机时间

    与上述相反,从/dev/uradom读取不会阻塞。从/dev/uradom读取也会消耗熵池,但当熵不足时,它不会阻塞,而是重用部分读取的随机数据中的位。据说它容易受到密码分析攻击。这是一种理论上的可能性,因此不鼓励从/dev/uradom读取以收集加密操作中的随机性

    默认情况下,java.security.SecureRandom类从/dev/random文件读取数据,因此有时会在随机时间段内阻塞数据。现在,如果读取操作在所需的时间内没有返回,Oracle服务器将超时
    import java.io.*;
    import java.sql.*;
    public class TestConnect {
        public static void main(String[] args) {
            try {
                System.out.println("Connecting to oracle"); 
                Connection con=null;
                Class.forName("oracle.jdbc.driver.OracleDriver");
                con=DriverManager.getConnection(
                   "jdbc:oracle:thin:@172.16.48.100:1535:sample",
                   "JOHN",
                   "90009000");
                System.out.println("Connected to oracle"); 
                con.close();
                System.out.println("Goodbye");
            } catch(Exception e) { e.printStackTrace(); }
        }
    }
    
    "main" prio=10 tid=0x00007f7cc8009000 nid=0x2f3a runnable [0x00007f7cce69e000]
       java.lang.Thread.State: RUNNABLE
            at java.net.Inet4AddressImpl.getLocalHostName(Native Method)
            at java.net.InetAddress.getLocalHost(InetAddress.java:1444)
            at sun.security.provider.SeedGenerator$1.run(SeedGenerator.java:176)
            at sun.security.provider.SeedGenerator$1.run(SeedGenerator.java:162)
            at java.security.AccessController.doPrivileged(Native Method)
    
    $ hostname
    my.server.com
    
    127.0.0.1 my my.server.com
    
    run -> services.msc 
    
    SQL> SELECT PASSWORD_VERSIONS FROM DBA_USERS WHERE USERNAME='SCOTT';
    
    PASSWORD_VERSIONS
    -----------------
    11G 12C
    
    SQL> alter user scott identified by "tiger";
    
    User altered.
    
    SQL> SELECT PASSWORD_VERSIONS FROM DBA_USERS WHERE USERNAME='SCOTT';
    PASSWORD_VERSIONS
    -----------------
    10G 11G 12C