2009-02-03 55 views
1

我的團隊使用純Java(無連接池)和JTDS驅動程序構建了一個Java服務中的Windows服務,該服務連接到Windows 2003 Server中的SQL Server 2005。Windows 2003中JDBC連接可用的套接字數量

一段時間後,打開到數據庫的連接的處理方法先從以下堆棧跟蹤引發異常:

java.net.BindException: Address already in use: connect 
at java.net.PlainSocketImpl.socketConnect(Native Method) 
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl .java:305) 
at java.net.PlainSocketImpl.connectToAddress(PlainSoc ketImpl.java:171) 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.j ava:158) 
at java.net.Socket.connect(Socket.java:452) 
at java.net.Socket.connect(Socket.java:402) 
at java.net.Socket.<init>(Socket.java:309) 
at java.net.Socket.<init>(Socket.java:124) 

雖然程序員們小心關閉連接時,他們做的東西是不會對。

目前,我們解決了切換到命名管道協議的問題(因爲它們都在同一臺機器上),但這是一個臨時解決方案。

我已經使用了這個問題,似乎我們應該使用一些連接池庫如c3p0。這是解決問題的唯一辦法嗎?

我可以嘗試提高Windows 2003中的套接字限制嗎?

回答

3

您是否以非常快的速度打開/關閉連接?當TCP連接關閉時,它們在TIME_WAIT狀態中暫停一會兒。在Windows上,它們存在的默認時間是240秒。聽起來你可能在TIME_WAIT狀態下有很多tcp連接。

您可以通過運行netstat來檢查。如果在TIME_WAIT狀態下有大量到數據庫服務器的tcp連接,則連接池將解決您的問題。

您可以嘗試提高套接字限制和/或降低連接保持TIME_WAIT狀態的時間。但是這會改變所有tcp連接的行爲。因此請使用連接池:)我們使用dbcp作爲我們在Java中的連接池解決方案。

1

它看起來好像你的連接沒有被關閉。或者你試圖錯誤地重新使用連接...

強烈建議使用連接池出於各種性能原因。例如,您不需要每次創建連接,這非常昂貴。重新使用連接會造成一個不同的世界。

其次,你是否真的想創建自己的池化機制?這並不像看起來那麼簡單,有很多特殊的線程問題。只要使用經受住時間考驗的現有庫,就容易得多。