代码之家  ›  专栏  ›  技术社区  ›  Vitalii

利用simplejdbcall优化MSSQL服务器中存储过程的执行

  •  0
  • Vitalii  · 技术社区  · 6 年前

    我有执行某些存储过程的代码。 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);  
    

    当我运行这个命令时,我在profiler 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 回复  |  直到 6 年前
        1
  •  0
  •   Vitalii    6 年前

    我刚找到一个答案,也许这对某人有用。我们只需要避免3个电话 withoutProcedureColumnMetaDataAccess() SimpleJdbcCall .

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