1

重用CallableStatement的實例通常被認爲是一種好的做法(檢查here)。是否可以在不同的連接上執行CallableStament?

但是,當創建一個CallableStatement時,該陳述(根據我的理解)綁定 到特定的Connection。因此,我們通常做的:

Connection con = pool.getConnection(); 
CallableStatement st = con.prepareCall("{ some stmt; }"); 
st.executeQuery(); 
st.close(); 
con.close();    

從我檢查,以下是不會執行查詢:

Connection con = pool.getConnection(); 
CallableStatement st = con.prepareCall("{ some stmt; }"); 
con.close(); 
con = pool.getConnection(); // possibly another new connection, different than the one used to create the CallableStatement instance 
st.executeQuery(); 
st.close(); 

我的問題是:如果我想重用我所有的CallableStatement實例,但另一方面仍然能夠獲得新的連接並關閉舊的連接(不總是有相同的連接打開)我該怎麼辦?

回答

1

PreparedStatement s是(或應該)由您的JDBC驅動程序緩存。見例如http://www.mchange.com/projects/c3p0/

這意味着你不應該堅持一種方式並在連接之間使用,但不用擔心,驅動程序會爲你管理緩存。基本上,每個連接都會自己緩存,所以如果你有5個連接,你將有5個緩存副本,可能足夠小。

調用prepareStatement將從緩存中檢索緩存並分配,如果不緩存則分配。所以重複呼叫prepareStatement是輕量級的。這是API的正確用法。

參見例如Oracle's docs這在技術上是Oracle特定的,但我相信這些信息是標準的。

+0

所以,這意味着在執行查詢之前每次都執行'prepareCall'就可以了嗎?我沒有完全理解你的答案。它們被緩存,所以,我可以多次調用相同的'prepareCall'? – insumity

+0

@foobar IIRC,是的,這是正確的。每次調用prepareCall,JDBC都會檢查它是否已經存在於緩存中。 – djechlin

+0

謝謝,這回答我的問題(將在5分鐘內接受你的答案)。如果你可以在你的真實答案中附上你的評論答案,會很好。謝謝 ;) – insumity

相關問題