我们使用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显示,状态为TIMED_WAIT的SQL Server服务器连接消耗了所有动态可用的TCP端口(超过16000个)。
jtds或EL泄漏端口或连接?否。
事实证明我们的池配置是问题所在。我们的应用程序通常需要多个异步请求连接。该池只包含一个永久连接(分钟)。 EL动态打开多达10个连接(最大)但在执行一个语句后立即关闭这些连接。 jtds使用套接字与SQL服务器通信。关闭套接字大约需要4分钟(tcp_time_wait_interval),直到该端口可用于下一次连接。 缓慢但肯定地终端服务器耗尽了可用端口。
答案 0 :(得分:1)
OP解决方案。
修补程序:我们将池配置为使用相同的min / max值来阻止EL动态打开和关闭连接。
更详细说明:我们将使用外部连接池,这允许我们为空闲连接和连接空闲时间定义池,例如DBCP with minEvictableIdleTimeMillis。