2009-11-13 107 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狀態。每個都有自己的源端口從一個範圍動態分配。這很正常。