2010-11-23 51 views
0


CallableStatement和PreparedStatements是預編譯的。他們是否完成了連接?我的意思是,讓我們假設在應用程序服務器的連接池中有大約100個連接對象。有一個使用Callable和PreparedStatements的類。可以說,其用於即該方法:應用服務器中可調用語句和準備語句的行爲

public void invokePreparedAndCallableStatements(){ 
    //Fetches connection from pool 
    Connection con = getConnectionFromPool(); 
    CallableStatement cs = con.prepareCall(.....); 
    cs.register...(...); 
    cs.execute(); 
    ... 
    ... 
    PreparedStatement st = con.prepareStatement(...); 
    st.setXXX(..); 
    st.executeUpdate(); 
    ... 
} 

現在,當該方法被稱爲首次,連接是從池取出並處理請求。可調用和準備好的語句被編譯。當該方法被調用另外99次時,每次從池中獲取不同的連接時,那麼 - 是否將爲每個連接編寫語句?
在這種情況下使用語句的最佳方式是什麼?我不能讓它們(con.prepareCall()或con.prepareStatement())靜態,因爲連接不是靜態的。

回答

1

代碼實際上編譯並存儲在數據庫的共享池中。使用相同代碼的任意數量的連接都將受益於緩存。只要內存限制允許,編譯的代碼就會保留。

+0

謝謝JOTN。是否有任何方式相同的PL/SQL過程有相同的代碼的多個編譯版本? – 2010-11-29 09:08:48

0

該語句將被預編譯。合併將基於您指定的參數。

注意:如果您使用的是JDBC 3.0,則還可以共享您的PreparedStatements。參考:What's new in JDBC 3.0