`

Linux环境下java程序获取oracle数据库连接超时的问题解决

阅读更多

Linux下运行java程序(jdk 1.7),该程序会获取Oracle数据库连接,为了提高处理速度,采用了多个进程并行启动处理,这时,偶尔会发生数据库连接获取超时失败的异常发生.而且windows环境下没有问题.

 

java.sql.SQLException: IO Error: End of TNS data channel
 at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458)
 at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:546)
 at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:236)
 at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)


或者

java.sql.SQLException: IO Error: Connection reset
 at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:467)
 at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:546)
 at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:236)
 at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)

 

解决办法:

       java启动的时候添加启动参数 「-Djava.security.egd=file:/dev/./urandom」

注意:「-Djava.security.egd=file:/dev/urandom」的话,相当于「-Djava.security.egd=file:/dev/random」

 

原因分析

       Oracle的JDBC  driver程序里面在获取db连接的时候用到了java的SecureRandom,来获取随机字节数据流,用来产生随机数,-Djava.security.egd配置的就是随机数据收集伪设备,linux下有两种:

       1./dev/random,利用系统中断来生成随机数据,所以当系统不是很繁忙的时候,中断数很少,那么调用进程就会进入等待状态,直到有足够用的中断数的时候,才会返回随机数,而这时可能已经发生getConnection超时了

       2./dev/urandom,不利用系统中断来生成随机数,所以不会造成调用进程等待

所以,我们的遇到的情况必须使用urandom才行,由于java的bug,即使指定file:/dev/urandom,SecureRandom使用的仍然是random,为了绕过这个bug,我们发现了「-Djava.security.egd=file:/dev/./urandom」这种配置方式,来达到我们使用urandom的目的.

 

 为了验证配置前后的速度,可以用下面的小程序进行对比确认

JRand.java

 

import java.security.SecureRandom;
class JRand {
    public static void main(String args[]) throws Exception {
        System.out.println("Ok: " +
            SecureRandom.getInstance("SHA1PRNG").nextLong());
    }
}



time java -Djava.security.egd=file:/dev/urandom  JRand

time java -Djava.security.egd=file:/dev/./urandom  JRand

 

 

分享到:
评论

相关推荐

    linux系统上的java程序连接oracle错误超时

    在linux上通过JDBC连接ORACLE 时总是出现 java.sql.SQLRecoverableException: IO Error: Connection reset 的问题

    Tomcat下对Oracle数据库连接池数据源的配置

    - **Data Source URL**:指定Oracle数据库的连接URL,格式为`jdbc:oracle:thin:@<IP>:<PORT>:<SERVICE_NAME>`,例如`jdbc:oracle:thin:@192.168.168.14:1521:orcl`,这里的IP是数据库服务器的地址,PORT是数据库...

    java操作oracle的驱动包

    Java操作Oracle数据库主要依赖于Oracle提供的驱动包,这两个文件,`classes12.jar`和`ojdbc14.jar`,都是Oracle JDBC驱动程序的一部分,用于在Java应用程序中连接到Oracle数据库。下面将详细介绍这两个驱动包及其...

    java实现jdbc连接池+相关jar包

    Java JDBC 连接池是Java应用程序管理数据库连接的一种高效方式,它可以提高应用性能并优化资源使用。连接池在初始化时创建一定数量的数据库连接,并在应用程序需要时提供这些连接,用完后则回收到池中,而不是每次...

    ORACLE DB数据库常见问题解决及诊断技巧集锦-ORACLE DBA故障修复必备手册

    #### 关于Oracle数据库问题诊断信息获取 在处理Oracle数据库的问题时,正确地收集相关信息至关重要。以下是一些关键步骤: 1. **确认MAX_DUMP_FILE_SIZE参数设置**:确保此参数设置合理,以避免因空间不足而导致...

    论WebSphere中流行数据库连接池的配置.doc

    在WebSphere应用服务器中,数据库连接池的配置是实现高效数据库访问的关键步骤。...通过遵循上述步骤,你可以有效地配置和管理Oracle、SQL Server、Sybase和MySQL的连接池,提升你的应用程序的数据库访问效率。

    linux安装oracle错误解决方法

    在 Linux 环境中安装 Oracle 时,可能会遇到各种错误,这篇文章将对 ORA-01078、LRM-00109、ORA-01102、ORA-12541、ORA-12528、ORA-01033 和 ORA-28547 等错误进行详细的解决方法。 在安装 Oracle 10 后,配置网络...

    instantclient-basic-linux.x64-12.1.0.2.0.zip

    Oracle Instant Client是一款轻量级的数据库连接工具,用于在Linux x64环境下与Oracle数据库进行交互。"instantclient-basic-linux.x64-12.1.0.2.0.zip"是该工具的一个版本,其核心功能是为应用程序提供与Oracle...

    instantclient_11_2.rar

    Oracle Instant Client是一款轻量级的软件套件,它允许用户在没有完整Oracle客户端安装的情况下,进行与Oracle数据库的交互和连接。"instantclient_11_2.rar" 是Oracle Instant Client的一个版本,针对的是Oracle ...

    mysql-connector-java-5.1.47.jar

    MySQL Connector/J 5.1.47 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于连接Java应用程序到MySQL服务器的驱动程序。这个JAR(Java Archive)文件包含了所有必要的类和资源,使得开发者能够在Java环境中...

    instantclient文件.rar

    Oracle Instant Client是一款轻量级的Oracle数据库连接工具,它允许应用程序在无需完整Oracle数据库客户端安装的情况下,与Oracle数据库服务器进行通信。这个“instantclient文件.rar”压缩包包含了实现这一功能所需...

    instantclient-19-5

    这是一个轻量级的客户端库,主要用于连接到Oracle数据库服务器,允许应用程序在无需完整Oracle数据库安装的情况下执行SQL查询和其他数据库操作。这个版本可能是针对Oracle数据库19c的优化版。 描述中的"自存解决...

    JAVA上百实例源码以及开源项目源代码

    Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 ...

    jdbc 连接池

    它提供了一种标准的方法,使得Java应用程序能够连接到各种不同的数据库,而无需关心底层数据库的实现细节。连接池在JDBC中扮演着重要的角色,它提高了数据库操作的性能和效率。 一、C3P0连接池 C3P0是一个开源的...

    java,weblogic配置(数据源,linux项目发布)

    本篇将详细探讨Java和WebLogic的配置,特别是数据源设置以及在Linux环境下发布项目的过程。 首先,我们要了解如何在WebLogic中配置数据源。数据源是Java应用服务器中连接到数据库的关键组件。在WebLogic中,我们...

    java开源包4

    Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是...

    java阻塞模型tns协议代理

    3. `stop.sh` 和 `run.sh`:这些是Unix/Linux shell脚本,可能用于启动和停止Java应用程序,通常在命令行环境下运行。 4. `resources` 文件夹:可能包含项目运行所需的配置文件、静态资源或其他非源代码文件。 5. `....

    java开源包6

    Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是...

    java开源包9

    Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是...

Global site tag (gtag.js) - Google Analytics