2011-12-06 108 views
0

我使用Spring 2.5;一個使用apache-commons-dbcp連接池的SimpleJdbcTemplate。還有一個線程池在運行查詢時產生一個線程(一旦完成所有查詢並處理它們的結果,那麼線程就會產生並行運行查詢)。DB連接飢餓

最終,所有線程正在等待TIMED_WAIT中的getConnection()。沒有線程似乎得到一個連接。我檢查了數據庫,連接全部空閒。

這是什麼造成的?我有10個連接作爲最大池大小和50-100個線程。我應該如何配置? DBA說應該有足夠的連接(我同意,因爲它們都是空閒的)。

同樣的事情發生在BoneCP上,並且也是SimpleJdbcTemplate的數據源。

+0

猜測,您沒有明確關閉連接。 –

+1

因爲他使用'SimpleJdbcTemplate'來正確處理它,所以我不認爲OP沒有關閉連接。但顯然這是第一次嘗試。但是你確定這些連接閒置嗎?你有100個線程,只有10個連接...如果SQL查詢佔用大部分線程時間,則90個線程保證等待連接,而剩餘10個線程實際上正在運行查詢(可能正在等待'socketRead'上的結果)。你確定所有的**線程都在等待嗎? –

+0

SimpleJdbcTemplate應該關閉它們。在線程中查看JConsole,是的,所有人都在等待。查詢的平均時間少於500毫秒。我已經離開它超過15分鐘,以確保它不是查詢緩慢,沒有結果。 – dontocsata

回答

2

原來是因爲在循環ResultSet的過程中,另一個查詢已經啓動,所以如果有足夠的第一個查詢,第二個查詢就無法獲得連接,並且一切都會死鎖。