Java 高性能混凝土&x2B;Oracle连接=灾难的秘诀?

Java 高性能混凝土&x2B;Oracle连接=灾难的秘诀?,java,oracle,jdbc,connection,hpc,Java,Oracle,Jdbc,Connection,Hpc,我正在HPC(高性能计算)集群上运行Java应用程序。该应用程序通过JDBC瘦连接到Oracle 11.2.0数据库。考虑到这是在集群上,大量的连接是并发进行和维护的(尽管与数据库的实际交互相对较少)。并发连接的潜在最大数量将是4500(尽管它永远不会达到那么高) 应用程序工作正常,直到第125次并行连接失败,出现以下错误。此错误消息在后续连接尝试中持续存在: java.sql.SQLException: No more data to read from socket at oracle.jd

我正在HPC(高性能计算)集群上运行Java应用程序。该应用程序通过JDBC瘦连接到Oracle 11.2.0数据库。考虑到这是在集群上,大量的连接是并发进行和维护的(尽管与数据库的实际交互相对较少)。并发连接的潜在最大数量将是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)
java.sql.SQLException:不再从套接字读取数据
位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:113)
位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:147)
位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:209)
位于oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1129)
位于oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1080)
位于oracle.jdbc.driver.T4C8TTIpro.receive(T4C8TTIpro.java:131)
位于oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:902)
位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:269)
位于oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:454)
位于oracle.jdbc.driver.T4CConnection(T4CConnection.java:165)
位于oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
位于oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:802)
位于java.sql.DriverManager.getConnection(DriverManager.java:582)
位于java.sql.DriverManager.getConnection(DriverManager.java:185)
我认为这与限制数据库的连接数有关,对吗?或者这与数据库上的负载有关

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


非常感谢。

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

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

另外,您是否一直都有/需要4500个连接,或者您是否有4500个线程,每个线程都需要突发的DB连接?如果是后者,一个连接池(比如500个)就足够了

编辑:当然,它可能是一个Oracle配置,打击你;查看前面的问题:


我目前没有使用连接池。考虑到我是并行执行的,您知道我将如何创建一个每个应用程序都可以访问的应用程序吗?实际上,我不确定您将如何在应用程序之间共享一个应用程序。应用程序是指不同的应用程序,而不是一个应用程序中的不同线程吗?是的,应用程序正在多个群集节点上运行。它们本质上是同一应用程序的不同实例;首先,我想看看是否可以让Oracle直接支持所需的连接数量,这是最简单的体系结构选项。我编辑了我的答案,让你们看一篇之前的相关文章(我必须补充,不是我的)。如果这被证明是不可能实现的,您可能需要实现某种DB连接代理,它位于您的应用程序和DB之间,但是这是一个相当大的步骤,它本身也带来了一些相当大的挑战。结果表明,进程数达到了最大值。从那时起,一切都很好。