Java Oracle JDBC间歇性连接问题
我遇到了一个非常奇怪的问题 这是连接到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
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异常: 连接重置”) 问题有两个方面
-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