我正在 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/