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上通过JDBC连接ORACLE 时总是出现 java.sql.SQLRecoverableException: IO Error: Connection reset 的问题
- **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数据库主要依赖于Oracle提供的驱动包,这两个文件,`classes12.jar`和`ojdbc14.jar`,都是Oracle JDBC驱动程序的一部分,用于在Java应用程序中连接到Oracle数据库。下面将详细介绍这两个驱动包及其...
Java JDBC 连接池是Java应用程序管理数据库连接的一种高效方式,它可以提高应用性能并优化资源使用。连接池在初始化时创建一定数量的数据库连接,并在应用程序需要时提供这些连接,用完后则回收到池中,而不是每次...
#### 关于Oracle数据库问题诊断信息获取 在处理Oracle数据库的问题时,正确地收集相关信息至关重要。以下是一些关键步骤: 1. **确认MAX_DUMP_FILE_SIZE参数设置**:确保此参数设置合理,以避免因空间不足而导致...
在WebSphere应用服务器中,数据库连接池的配置是实现高效数据库访问的关键步骤。...通过遵循上述步骤,你可以有效地配置和管理Oracle、SQL Server、Sybase和MySQL的连接池,提升你的应用程序的数据库访问效率。
在 Linux 环境中安装 Oracle 时,可能会遇到各种错误,这篇文章将对 ORA-01078、LRM-00109、ORA-01102、ORA-12541、ORA-12528、ORA-01033 和 ORA-28547 等错误进行详细的解决方法。 在安装 Oracle 10 后,配置网络...
Oracle Instant Client是一款轻量级的数据库连接工具,用于在Linux x64环境下与Oracle数据库进行交互。"instantclient-basic-linux.x64-12.1.0.2.0.zip"是该工具的一个版本,其核心功能是为应用程序提供与Oracle...
MySQL Connector/J 5.1.47 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于连接Java应用程序到MySQL服务器的驱动程序。这个JAR(Java Archive)文件包含了所有必要的类和资源,使得开发者能够在Java环境中...
Oracle Instant Client是一款轻量级的软件套件,它允许用户在没有完整Oracle客户端安装的情况下,进行与Oracle数据库的交互和连接。"instantclient_11_2.rar" 是Oracle Instant Client的一个版本,针对的是Oracle ...
Oracle Instant Client是一款轻量级的Oracle数据库连接工具,它允许应用程序在无需完整Oracle数据库客户端安装的情况下,与Oracle数据库服务器进行通信。这个“instantclient文件.rar”压缩包包含了实现这一功能所需...
这是一个轻量级的客户端库,主要用于连接到Oracle数据库服务器,允许应用程序在无需完整Oracle数据库安装的情况下执行SQL查询和其他数据库操作。这个版本可能是针对Oracle数据库19c的优化版。 描述中的"自存解决...
它提供了一种标准的方法,使得Java应用程序能够连接到各种不同的数据库,而无需关心底层数据库的实现细节。连接池在JDBC中扮演着重要的角色,它提高了数据库操作的性能和效率。 一、C3P0连接池 C3P0是一个开源的...
本篇将详细探讨Java和WebLogic的配置,特别是数据源设置以及在Linux环境下发布项目的过程。 首先,我们要了解如何在WebLogic中配置数据源。数据源是Java应用服务器中连接到数据库的关键组件。在WebLogic中,我们...
Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是...
3. `stop.sh` 和 `run.sh`:这些是Unix/Linux shell脚本,可能用于启动和停止Java应用程序,通常在命令行环境下运行。 4. `resources` 文件夹:可能包含项目运行所需的配置文件、静态资源或其他非源代码文件。 5. `....
Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是...
Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是...
Oracle数据库工具 WARTS WARTS是一个纯Java数据库工具,可以执行字符编码识别的数据同步。开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是...