Оптимизация выполнения хранимой процедуры на MSSQL-сервере с помощью SimpleJdbcCall - PullRequest
0 голосов
/ 05 июля 2018

У меня есть код, который выполняет некоторые хранимые процедуры. Используется драйвер mssql-jdbc для подключения к базе данных Microsoft SQL Server.

Вот упрощенный код

SimpleJdbcCall call = simpleJdbcCallFactory.create(jdbcTemplate)
    .withSchemaName(SCHEMA)
    .withProcedureName(SP)
    .declareParameters(
        new SqlParameter("Id1", Types.INTEGER),
        new SqlParameter("Id2", Types.TINYINT),
        new SqlParameter("Id3", Types.INTEGER))
    .returningResultSet("result", (rs, rowNum) -> MappingObject.builder()
            .id(rs.getInt("Id"))
            .date(rs.getTimestamp("Date"))
            // .......
            .build());

MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("Id1", 1);
params.addValue("Id2", 2);
params.addValue("Id3", 3);

Map queryRes = call.execute(params);  

Когда я запускаю это, я вижу в профилировщике 3 звонки:

  • exec sp_executesql N'EXEC sp_stored_procedures @P0, @P1, @P2 ',N'@P0 nvarchar(4000),@P1 nvarchar(4000),@P2 nvarchar(4000)',N'MY_SP_NAME',N'MY_NAMESPACE',NULL Кажется, он проверяет, существует ли хранимая процедура
  • exec sp_executesql N'EXEC sp_sproc_columns_100 @P0, @P1, @P2,@P3,@P4 ',N'@P0 nvarchar(4000),@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 nvarchar(4000),@P4 nvarchar(4000)',N'MY_SP_NAME,N'MY_NAMESPACE',NULL,NULL,N'3' получает информацию о столбце этого sp
  • exec sp_executesql N'EXEC MY_NAMESPACE.MY_SP_NAME @P0, @P1, @P2 ',N'@P0 int,@P1 tinyint,@P2 int',1,2,3 и, наконец, он выполняет мою хранимую процедуру

Я вижу в профилировщике 3 вызова sql каждый раз, когда я запускаю эту хранимую процедуру. Я хотел бы сделать только один звонок, это возможно с SimpleJdbcCall?

1 Ответ

0 голосов
/ 05 июля 2018

Я только что нашел ответ, может быть, это кому-нибудь пригодится. Все, что нам нужно, чтобы избежать 3 вызовов, это withoutProcedureColumnMetaDataAccess() для SimpleJdbcCall.

Как это

SimpleJdbcCall getQACall = simpleJdbcCallFactory.create(jdbcTemplate)
    .withSchemaName(SCHEMA_ARTICLE)
    .withProcedureName(SP_GET_ALL_QUESTIONS_ANSWERS)
    .withoutProcedureColumnMetaDataAccess()
    .declareParameters(
    // etc
...