簡體   English   中英

多線程 - MySQL java連接器編寫語句使用

[英]Multithreading - MySQL java connector prepared statement use

我創建了一個java類,它運行在它自己的線程中,該線程通過mysql查詢隊列工作,這樣它就不會阻塞主應用程序線程。 我想使用預處理語句,但是,如果我繼續重復使用相同的預處理語句,那么如果隊列中有兩個或多個相同的預處理語句(對於該類型的每個查詢,我都使用相同的preparestatement對象),它將有錯誤的提示PARAMS。 如果我每次創建一個新的preparestatement它會在每次運行時重新編譯准備好的語句,還是會檢測到它已經被編譯並執行了?

我認為您真的無法利用Apache DBCP等Java連接池實現中提供的Prepared Statement Pooling功能。 這是因為您將准備好的語句對象存儲在隊列中。 如果您可以將SQL和參數存儲在自定義類中,並在執行線程中創建/執行PreparedStatements,您可以通過使用DBCP之類的東西獲得池化的好處

請參閱有關如何啟用語句池的DBCP配置文檔 (poolPreparedStatements)

它將在每次運行時重新編譯准備好的語句,還是會檢測到它已經被編譯並剛剛執行?

這取決於DBMS,而不是Java,但是總體思路是,它可以檢測現有編譯語句的重用,並將其合並到驅動程序或服務器中。 請參見JDBC 4.0規范#11.6“池連接的語句重用”。

來自java教程

如果要多次執行一個Statement對象,通常可以減少執行時間,而改用PreparedStatement對象。

PreparedStatement對象的主要特性是,與Statement對象不同,它在創建時會被賦予一個SQL語句。 這樣做的好處是,在大多數情況下,此SQL語句會立即發送到DBMS,並在此進行編譯。 因此,PreparedStatement對象不僅包含SQL語句,還包含已預編譯的SQL語句。 這意味着當執行PreparedStatement時,DBMS可以只運行PreparedStatement SQL語句而無需先編譯它。

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html#supply_values_ps

暫無
暫無

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

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