Я использую Microsoft JDBC Driver 2.0 с SQL Server 2005. Чтобы лучше объяснить свой вопрос, позвольте мне начать с примера кода для вызова хранимой процедуры.
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();
}
Используя SQL Profiler, я вижу, что драйвер JDBC генерирует следующие операторы sql для выполнения вызова:
declare @P1 int
set @P1=1
exec sp_prepexec @P1 output, N'@P0 int', N'EXEC getEmployeeManagers @P0', 50
select @P1
Это означает, что когда я выполняю хранимую процедуру с помощью CallableStatement, вызывается оператор sp_prepexec. И позже, когда я закрываю оператор, вызывается sp_unprepare. Похоже, это поведение драйвера JDBC по умолчанию. Проблема в том, что накладные расходы на создание подготовленного оператора и его последующее закрытие влияют на производительность. Есть ли способ для драйвера выполнить хранимую процедуру напрямую? Почему водитель не может просто сделать это -
exec getEmployeeManagers @P0=50