2009-11-13 128 views
1

我使用Hibernate 3,并且我正面临与连接关闭有关的问题。休眠导致太多time_wait连接

我使用c3p0-0.9.1.2.jar和我检查到连接到由Hibernate打开的数据库服务器,我发现有既定其是5号的连接;在服务器的一些TCP端口上(见下面的日志)。

但这些已建立的连接保持在TIME_WAIT状态改变它们所建立的TCP端口,从而释放他们使用较早的端口,使这些端口(而不是关闭它们)。

这不断发展,使得数量在数百;用于TIME_WAIT条件下的连接。

我不确定发生了什么,以及为什么端口从Established建立到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 

感谢您的帮助。

回答

3

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

在问题的另一部分,当客户端连接到由主机名和目标端口指定的服务器时,客户端的连接将分配给端口。其原因是连接由四件事情来标识:目标主机,目标端口,源主机,源端口

这正是你所看到的发生在你的netstat输出:你有在池中创建5个建立的连接,以及一些即将被关闭的一个处于TIME_WAIT状态。每个都有自己的源端口从一个范围动态分配。这很正常。