java - HPC + Oracle 连接 = 灾难的秘诀?

标签 java oracle jdbc connection hpc

我正在 HPC(高性能计算)集群上运行 Java 应用程序。该应用程序与 Oracle 11.2.0 数据库建立 JDBC 瘦连接。鉴于这是在集群上,因此会同时建立和维护大量连接(尽管与数据库的实际交互相对较少)。潜在的最大并发连接数将为 4500(尽管永远不会达到那么高)。

应用程序工作正常,直到大约第 125 个并行连接时失败并出现以下错误。此错误消息在后续连接尝试中仍然存在:

java.sql.SQLException: No more data to read from socket
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:209)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1129)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1080)
at oracle.jdbc.driver.T4C8TTIpro.receive(T4C8TTIpro.java:131)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:902)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:269)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:454)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:802)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)

我认为这与数据库允许的连接数限制有关吗?或者这与数据库的负载有关?

有人知道如何解决这个问题,以便我能够并行建立更多数量的连接吗?

提前非常感谢。

最佳答案

可能只是您的连接池,如果您使用一个连接池,我希望 Oracle 能够处理超过 125 个连接池。即您选择的方法的人为上限为 125,很可能是默认情况,而不是您自己强加的。

您是否使用 Spring 之类的东西来管理您的连接,例如通过 Apache Commons DBCP 库?

此外,您是否实际上始终拥有/需要 4500 个连接,或者您是否有 4500 个线程,每个线程都需要突发的数据库连接?如果是后者,例如 500 个连接池可能就足够了。

编辑:当然,这可能是 Oracle 配置引起了您的注意;看看这个之前的问题:

How to check the maximum number of allowed connections to an Oracle database?

关于java - HPC + Oracle 连接 = 灾难的秘诀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7849590/

相关文章:

java - 为什么这个do-while计算是错误的?

java - 获取与 JSP 的 ServletContext 连接

java - 准备好的语句和 JDBC 驱动程序

java - 文本文件操作: Take data from text file and write a new text file with the data taken from the original file

java - 在 JAVA 中使用其 PID 验证进程是否正在运行

oracle - Sparx Enterprise 架构师和 Oracle ODBC

oracle 在特定字段更新后触发,然后插入

PostgreSQL 错误代码未以 int 形式返回?

java - 将一个巨大的远程数据库表同步到一个包含字段 "lastModificationTime"的表的本地数据库表

java - 使用没有容器目标的 BoxLayout?