簡體   English   中英

在多個線程中以Java執行MySQL存儲過程的快速方法?

[英]Fast way to execute MySQL stored procedures in Java within multiple threads?

在Java的線程環境中發布存儲過程的最快選擇是什么? 根據http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j-examples-preparecall所述, Connection.prepareCall()是一種昂貴的方法。 那么當無法同步訪問單個CallableStatement時,在每個線程中調用它的替代方法是什么?

大多數JDBC驅動程序每個連接僅使用一個套接字。 我認為MySQL也使用單個套接字。 在多個線程之間共享一個連接是一個糟糕的性能想法。

如果在不同線程之間使用多個連接,則每個連接都需要一個CallableStatment。 每個連接都需要一個CallabaleStatement池。 在這種情況下,最簡單的方法是包裝連接類並將所有調用委派給原始類。 這可以使用Eclipse很快地創建。 在包裝好的方法prepareCall()中,您可以添加一個簡單的池。 您還需要CallableStatement的包裝類。 close方法將CallableStatement返回到池中。

但是首先您應該檢查該呼叫是否真的很昂貴,因為許多驅動程序已經在內部進行了此類輪詢。 創建一個prepareCall()和close()循環並計算時間。

連接不是線程安全的,因此您不能在線程之間共享它。

當您prepareCall時,JDBC驅動程序(可能)正在告訴RDBMS系統執行存儲在服務器端的大量工作。 您可能在這里過早的優化感到內。

經過一番思考之后,似乎如果您在使用此基礎結構代碼時遇到了問題,那么問題就出在別處。 大多數應用程序不需要花費大量時間來完成這些工作。
確保您使用的是數據源,大多數都進行連接緩存,有些甚至進行語句緩存。
同樣,要使它成為性能瓶頸,還意味着您要一個接一個地進行許多查詢,或者您的連接池太小。 也許您應該對代碼進行一些基准測試,以查看存儲的proc花費了多少時間以及JDBC代碼花費了多少時間。
當然,我會遵循MySQL關於使用CallableStatement的建議,我相信他們已經對此進行了基准測試。 大多數應用程序在線程之間不共享任何內容,這很少有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM