java - 使用带内部连接池的 eclipselink 出现网络错误

标签 java sockets eclipselink connection-pooling connection-leaks

我们已经使用 eclipselink 及其内部连接池功能实现了一个 JavaSE 应用程序。我们已将默认池配置为使用最少 1 个和最多 10 个连接。 在 Windows 终端服务器上安装此应用程序并同时运行 50 个 session 进行压力测试后,我们在几个 session 中遇到了以下异常。

[EL Severe]: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Network error IOException: No buffer space available (maximum connections reached?): connect

我们使用 jtds 作为驱动程序来连接到 MS SQL 服务器。使用 netstat 显示所有动态可用的 TCP 端口(超过 16000 个)都被处于 TIMED_WAIT 状态的 SQL 服务器连接占用。

jtds 或 EL 是否泄漏端口或连接?没有。

原来是我们的池配置出了问题。我们的应用程序通常需要多个连接来进行异步请求。该池仅包含一个永久连接(最小)。 EL 动态打开最多 10 个连接(最多),但在执行一条语句后立即关闭这些连接。 jtds 使用套接字与 SQL Server 通信。关闭套接字需要大约 4 分钟 (tcp_time_wait_interval),直到该端口可用于下一个连接。 终端服务器缓慢但肯定会耗尽可用端口。

最佳答案

OP 的解决方案。

修补程序:我们将池配置为使用相同的最小值/最大值,以防止 EL 动态打开和关闭连接。

更详细:我们将使用外部连接池,它允许我们为空闲连接和连接空闲时间定义一个池,例如具有 minEvictableIdleTimeMillis 的 DBCP。

关于java - 使用带内部连接池的 eclipselink 出现网络错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26423346/

相关文章:

java - 一个线程所做的更改不会反射(reflect)在另一个线程中

c - Unix 域流套接字中数据缓冲区的大小

java - JPA EclipseLink 2 查询性能

java - 如何在 JPA 条件查询中使用 Oracle 的 'connect by' 子句?

Java动态方法返回类型

java - 使用 BufferedReader 读取 java 中的特殊字符

java - nginx.conf中的 "location/logs"和 "location/logs/"有什么区别

java - java客户端什么时候可以从c服务器接收-1?

c# - C#在套接字中发送屏幕截图

java - JPA:左连接不适用于 where 子句中的 "is null"