我们已经使用具有内部连接池功能的 eclipselink 实现了一个 JavaSE 应用程序。我们已将默认池配置为使用最少 1 个和最多 10 个连接。在 Windows 终端服务器上安装此应用程序并同时运行 50 个会话进行压力测试后,我们在多个会话中遇到了以下异常。
[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 服务器通信。关闭一个套接字大约需要 4 分钟(tcp_time_wait_interval),直到该端口可用于下一个连接。终端服务器缓慢但肯定地耗尽了可用端口。