我有一個Java批處理選擇一個大resulset(我使用Spring callbackhandler處理元素)。 回調處理程序將任務放入固定線程池中以處理該行。 我的池大小固定在16個線程上。 Resulset包含大約100k個元素。 所有數據庫訪問代碼通過JdbcTemplate或Hibernate/Spring進行處理,不存在手動連接管理。 我試過用Atomikos和Commons DBCP作爲連接池。java連接池,多線程批處理中有多少個最大連接數?
現在,我認爲在我的連接池中有17個最大連接數就足以讓這個批處理完成。一個用於select,另一個用於連接池中的線程,用於更新某些行。然而,這似乎太天真了,因爲我必須指定最大池大小幅度更大(沒有嘗試過一個確切的值),首先我嘗試了50在我的本地Windows機器上工作,但似乎不是在我們的Unix測試環境中足夠了。在那裏我必須指定128才能使它工作(再次,我甚至沒有嘗試過50到128之間的值,我直接去到了128)。
這是正常的嗎?在我缺少的連接池中是否有一些基本機制?我發現很難調試,因爲我不知道如何看到打開的連接會發生什麼。我嘗試了各種log4j設置,但沒有得到滿意的結果。
編輯,附加信息:當連接池大小似乎太低時,該批似乎掛起。如果我在進程上執行jstat,我可以看到所有線程都在等待新的連接。起初,我沒有在dbcp連接池上指定maxWait屬性,這會導致線程在新連接上無限期地等待,並且我注意到批處理保持懸掛狀態。所以沒有連接被釋放。然而,這只是在處理了+ 70k行之後才發生的,這就排除了我最初對連接泄漏的預感。
edit2:我忘了提及我已經在我的任務中重寫了更新部分。我在ConcurrentLinkedQueue中更新了我的更新,我清空了1000個元素。所以我實際上只做了大約100次更新。
edit3:我使用的是Oracle,我使用的是併發實用程序。所以我有一個配置了16位固定池的執行器。我將這些任務提交給這個執行器。我沒有在我的任務中手動使用連接,我使用線程安全的jdbctemplate並詢問連接池中的連接。我想Spring/DBCP處理連接/線程問題。
我編輯我的問題更多的信息,我的所有問題dissapeared表現其實很不錯即使我創建了一個Runnable/row – 2012-02-29 18:21:13
嘗試使用Netbeans分析器,它爲您提供線程的實時統計信息,例如等待CPU,等待鎖定,等待IO等。如果結果顯示線程正在等待數據庫連接,那麼增加游泳池的大小是好的,否則優化瓶頸。http://profiler.netbeans.org/ – 2012-02-29 18:29:26
我使用jvisualvm。不幸的是,我無法連接一個探查器到發生問題的unix env ,這是一個鎖定的環境,但我並不是真的有興趣調整我的池大小,現在它工作正常,128和我的源數據大小是不變的,所以應該是好的。然而,我的問題是,應該不夠17?如果不是,爲什麼? – 2012-02-29 19:24:45