1

我正在使用 Hibernate 3,我遇到了与关闭连接相关的问题。

我正在使用 c3p0-0.9.1.2.jar 并检查了 Hibernate 打开的与数据库服务器的连接,我发现已经建立了 5 个连接;在服务器的一些 TCP 端口(见下面的日志)。

但是这些已建立的连接会不断更改它们建立的 TCP 端口,从而释放它们使用的较早端口,使这些端口处于 TIME_WAIT 状态(而不是关闭它们)。

这继续进行,数以百计;对于 TIME_WAIT 条件下的连接。

我不确定发生了什么以及为什么端口从已建立切换到 TIME_WAIT 并且之前的端口都没有关闭。

下面是通过运行 NETSTAT -ano|find "x.9" 获取的示例,其中 x.9 是数据库服务器 IP。

TCP     x.124.x.66:4379     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4381     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4382     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4383     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4384     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4385     x.124.x.9:1433      TIME_WAIT       0

TCP     x.124.x.66:4386     x.124.x.9:1433      ESTABLISHED     5916

TCP     x.124.x.66:4387     x.124.x.9:1433      ESTABLISHED     5916

TCP     x.124.x.66:4388     x.124.x.9:1433      ESTABLISHED     5916

TCP     x.124.x.66:4389     x.124.x.9:1433      ESTABLISHED     5916

TCP     x.124.x.66:4390     x.124.x.9:1433      ESTABLISHED     5916

我使用的 Hibernate.properties 文件。

hibernate.c3p0.min_size=5
hibernate.c3p0.timeout=2
hibernate.c3p0.max_size=50
hibernate.c3p0.idle_test_period=10000
hibernate.connection.release_mode=auto

感谢帮助。

4

1 回答 1

3

TIME_WAIT只是一方或双方已经终止连接但尚未关闭的状态。根据您的操作系统,您可以微调 TIME_WAIT 中的连接时间。所以这并不意味着什么不好,只要没有太多阻碍新连接的创建,它对性能没有影响。

在问题的另一部分,当客户端连接到由主机名和目标端口指定的服务器时,客户端的连接将分配给一个端口。这样做的原因是连接由四个东西标识:目标主机、目标端口、源主机、源端口

这正是您在 netstat 输出中看到的情况:池创建了 5 个已建立的连接,还有一些即将关闭的连接处于 TIME_WAIT 状态。每个都有自己的源端口,从一个范围动态分配。这是完全正常的。

于 2009-11-13T12:32:02.487 回答