使用带内部连接池的eclipselink发生网络错误

时间:2014-10-17 10:45:57

标签: java sockets eclipselink connection-pooling connection-leaks

我们使用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),直到该端口可用于下一次连接。 缓慢但肯定地终端服务器耗尽了可用端口。

1 个答案:

答案 0 :(得分:1)

OP解决方案。

修补程序:我们将池配置为使用相同的min / max值来阻止EL动态打开和关闭连接。

更详细说明:我们将使用外部连接池,这允许我们为空闲连接和连接空闲时间定义池,例如DBCP with minEvictableIdleTimeMillis。