2013-07-24 2 views
2

Мы заметили, что производительность не была звездной, но так не беспокоила нас, потому что это был фоновый процесс, после чего мы связались с нашим администратором баз данных, который сообщил нам, что каждый вызов хранимой процедуры охватывал вторую вызов для получения метаданных из БД.NamedParameterJdbcTemplate, вызывающий нежелательный вызов метаданных

Очевидно, нигде в нашем коде мы не совершаем такие вызовы, и нет, мы не используем рамки ORM, которые могли бы выпустить их за кулисами.

Вот наша установка: - автономный (без контейнера) приложения Java - пружинно-JDBC-3.2.2 используется для доступа данных - мы используем Microsoft JDBC Driver 4.0 для SQL Server - мы используя этот синтаксис: CALL SPROC_NAME (: PAR_1)

Любые указатели на то, как удалить этот дополнительный вызов, действительно оценены. Я не смог включить ведение журнала для драйвера SQL Server, поэтому следующим шагом я попытаюсь отладить весенний JDBC-код.

Спасибо, М.В.

ответ

1

Как я уже говорил, каждый хранимой процедура Призыв (с использованием PreparedStatement) причиняли 2 вызовы к БД с первым вызовом является очень дорогим: Exec sp_sproc_columns @procedure_name = SPROC_NAME, @ ODBCVer = 3 (вызов метаданных) EXEC SPROC_NAME @ P0, P1 @, @ P2, P3 @ (фактический вызов)

После прочтения нижеследующего нити мы наконец-то работать с: Why is calling a stored procedure always preceded by a call to sp_sproc_columns?

Даже хотя мы используем JDBC вместо ADO.NET, проблема кажется очень похожей на нашу, поэтому мы решили, что стоит попробовать.

После того, как изменение было на месте, сеанс трассировки в БД подтвердил, что первый вызов больше не присутствует в журналах.

Раньше мы передавали карту в качестве параметров. В тот момент, когда мы перешли на карту и указали правильный тип данных, мы начали видеть улучшения производительности.

Короче говоря, если у водителя есть все данные (фактически метаданные) о параметрах, то он не выдаёт вызов метаданных.

Смежные вопросы