2009-05-28 5 views
1

SQL Server 2005でMicrosoft JDBCドライバ2.0を使用しています。私の質問をよく説明するために、ストアドプロシージャを呼び出すサンプルコードから始めましょう。ストアドプロシージャを実行する際のMicrosoft JDBCドライバのオーバーヘッド

declare @P1 int 
set @P1=1 
exec sp_prepexec @P1 output, N'@P0 int', N'EXEC getEmployeeManagers @P0', 50 
select @P1 

私はCallableStatementの、sp_prepexec 文を使用してストアドプロシージャを実行するときにこれが意味 - 私はJDBCドライバが呼び出しを行うために、次のSQL文を生成していることがわかりSQLプロファイラを使用して

public static void executeSproc(Connection con) 
{ 
    CallableStatement cstmt = con.prepareCall("{call dbo.getEmployeeManagers(?)}"); 
    cstmt.setInt(1, 50); 
    ResultSet rs = cstmt.executeQuery(); 

    while (rs.next()) { 
    // print results in the result set 
    } 
    rs.close(); 
    cstmt.close(); 
} 

が呼び出されます。そして、私がこの声明を終えると、sp_unprepare が呼び出されます。これはJDBCドライバのデフォルトの動作のようです。 問題は、プリペアドステートメントを生成し、それを閉じるためのオーバーヘッドがパフォーマンスに影響します。 ドライバに格納された プロシージャを直接実行する方法はありますか?なぜドライバはこれをしないのですか? -

exec getEmployeeManagers @P0=50 

答えて

4

SQLServer用にjTDSドライバを使用してみてください。私は仕事でそれを使用し、それはMSが提供するドライバよりもはるかに良いようです。

+0

ありがとうございます!私はjTDSを試して、それは美しく動作します。 –

関連する問題