java - 没有可用的缓冲区空间(达到最大连接数?)形成 Postgres EDB 驱动程序

标签 java postgresql jdbc socketexception

我们在通过 Java 应用程序连接到数据库时遇到异常。堆栈轨迹如下

com.edb.util.PSQLException: The connection attempt failed.
 at com.edb.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:189)
 at com.edb.core.ConnectionFactory.openConnection(ConnectionFactory.java:64)
 at com.edb.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:161)
 at com.edb.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
 at com.edb.jdbc3.Jdbc3Connection.<init>(Jdbc3Connection.java:24)
 at com.edb.Driver.makeConnection(Driver.java:391)
 at com.edb.Driver.connect(Driver.java:266)
 at java.sql.DriverManager.getConnection(Unknown Source)
 at java.sql.DriverManager.getConnection(Unknown Source)
 ... 12 more
Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): connect
 at java.net.PlainSocketImpl.socketConnect(Native Method)
 at java.net.PlainSocketImpl.doConnect(Unknown Source)
 at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
 at java.net.PlainSocketImpl.connect(Unknown Source)
 at java.net.SocksSocketImpl.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at java.net.Socket.<init>(Unknown Source)
 at java.net.Socket.<init>(Unknown Source)
 at com.edb.core.PGStream.<init>(PGStream.java:70)
 at com.edb.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:115)
 ... 20 more

当错误发生时,我们无法连接到互联网和数据库,不得不重新启动系统。但是错误在 3 天后以相同的代码再次发生,即连接到数据库时。我们使用 netstat 检查了 TCP 连接。但是没有很多 TCP 连接,即它没有达到最大限制。

我们的应用程序有多个长时间运行的 Java 进程,这些进程汇集数据库连接(不超过 60 个)并使其保持 Activity 状态以触发下一个查询(因为它必须每 2 秒轮询一次数据库)。我们应用程序中的一些查询正在连接大型表(1000 万条记录)以获取相关数据。

我们正在使用以下系统和应用程序

  • Windows 2003 服务器 SP2
  • Java 1.6
  • Postgres Plus Advanced 服务器 8.4 数据库
  • edb-jdbc14.jar Java 连接数据库驱动

除了将连接数从 100 增加到 120 之外,我们使用了 Postgres DB 的默认配置。

有人在使用 postgres edb 驱动程序时遇到过同样的错误吗?

谁能帮我们找到解决方案?

最佳答案

这看起来像是一个客户端问题——它甚至连服务器都连接不上。当 PostgreSQL 或 Advanced Server 用尽可用服务器连接时,它不是您收到的错误。

问题要么出在您的客户端程序/JVM 的资源中,要么出在 EDB JDBC 驱动程序的某处。如果您在 JVM 中找不到不正确的东西,并且由于您使用的是 PostgreSQL Plus Advanced Server,我建议您使用 EnterpriseDB 支持来获得有关其 JDBC 驱动程序的帮助。 (这与 PostgreSQL 不同)

关于java - 没有可用的缓冲区空间(达到最大连接数?)形成 Postgres EDB 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4656128/

相关文章:

java - 无法转换为 com.google.android.gms.location.LocationListener (我已经实现了 LocationLister)

java - 如何创建多个前台通知?

sql - 在 postgresql 选择中,将时间戳列添加到 additional_days 列

java - 使用 neo4j-jdbc 驱动程序与 Java 连接 neo4j

java - 在点扩展之前查找最后一个下划线之后的字符串

java - 为什么我们不能为 Iterator<IFoo> 返回 ArrayList<Foo>.iterator() ?

node.js - 在docker中使用wait-for-it.sh时启动包不完整

database - Postgres INSERT INTO ... SELECT 违反外键约束

java - 带有 JDBC 临时表的存储过程没有结果集

database - 使用 Sqoop 从 Sybase 导入数据的问题