在Java中的線程環境中發出存儲過程的最快選項是什麼?根據http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j-examples-preparecall Connection.prepareCall()是一個昂貴的方法。那麼當對一個CallableStatement的同步訪問不是一個選項時,在每個線程中調用它的選擇是什麼?在多線程中以Java執行MySQL存儲過程的快速方法?
0
A
回答
0
大多數JDBC驅動程序每個連接只使用一個套接字。我認爲MySQL也使用一個套接字。在多個線程之間共享一個連接是一個糟糕的性能想法。
如果在不同線程之間使用多個連接,那麼每個連接都需要一個CallableStatment。每個連接都需要一個CallabaleStatement池。在這種情況下,最簡單的方法是將連接類包裝並將所有調用委託給原始類。 Eclipse的創建速度非常快。在包裝方法prepareCall()中,您可以添加一個簡單的池。您還需要一個CallableStatement的包裝類。 close方法將CallableStatement返回到池中。
但是,首先你應該檢查是否真的很貴,因爲很多司機已經有這樣的民意調查。創建一個prepareCall()和close()循環並計算時間。
0
連接不是線程安全的,所以你不能跨線程共享它。
當你的prepareCall,JDBC驅動程序(可能)是告訴RDBMS系統做了很多存儲在服務器端的工作。你可能在這裏犯了過早的優化。
0
給這個稍加思考後,它看來,如果您有問題,與此基礎結構代碼,然後你的問題是在其他地方。大多數應用程序不需要花費過多的時間來完成這些工作。
確保您使用的是DataSource,大部分都是連接緩存,有些甚至是緩存語句。
也是因爲這是一個性能瓶頸,這意味着你正在一個接一個地做很多查詢,或者你的連接池太小。也許你應該在你的代碼上做一些基準測試,看看存儲過程需要多長時間,而JDBC代碼需要多少時間。
當然,我會遵循MySQL使用CallableStatement的建議,我相信他們已經對此進行了基準測試。大多數應用程序不會在線程之間共享任何內容,這很少是問題。
相關問題
- 1. 從PHP執行java MySQL存儲過程
- 2. 無法執行MySQL存儲過程
- 3. 執行Mysql存儲過程的問題
- 4. 爲什麼此存儲過程在Management Studio中快速執行,但不在應用程序中執行?
- 5. 用多參數在Loopback遠程方法中執行Postgres存儲過程
- 6. Java:通過多線程並行化快速排序
- 7. 在另一個存儲過程中未執行存儲過程
- 8. 在存儲過程中執行存儲過程
- 9. MySQL存儲過程執行錯誤
- 10. mysql存儲過程執行SHOW CREATE TABLE
- 11. 使用DBVisualizer執行MYSQL存儲過程
- 12. 在多線程進程中運行存儲過程
- 13. 執行在多線程靜態方法
- 14. MySQL線程快速增長
- 15. 無法讓我的存儲過程在MySQL上執行
- 16. 通過Java中的線程控制方法的執行
- 17. 具有多種方法的Java類可以在線程中執行
- 18. isAlive()在java多線程中執行
- 19. 在SQL Server中執行存儲過程
- 20. 在視圖中執行存儲過程?
- 21. SSRS在Oracle中執行存儲過程
- 22. 在sql profiler中執行存儲過程
- 23. 在vb.net中執行存儲過程
- 24. 在存儲過程中執行FuncView
- 25. 在EntityFramework中執行Oracle存儲過程
- 26. 在報告中執行存儲過程
- 27. 執行SQL存儲過程
- 28. 當執行存儲過程
- 29. 快速多線程問題
- 30. 快速排序與更多的線程執行更差