使用 SimpleJdbcCall 优化 MSSQL 服务器中存储过程的执行
Optimization of execution of stored procedure in MSSQL server with SimpleJdbcCall
我有执行某些存储过程的代码。 mssql-jdbc
连接到 Microsoft 的驱动程序 SQL 使用服务器数据库。
这里是简化的代码
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
吗?
我刚刚找到了答案,也许这对某些人有用。我们需要避免 3 次调用的是 withoutProcedureColumnMetaDataAccess()
for SimpleJdbcCall
。
像这样
SimpleJdbcCall getQACall = simpleJdbcCallFactory.create(jdbcTemplate)
.withSchemaName(SCHEMA_ARTICLE)
.withProcedureName(SP_GET_ALL_QUESTIONS_ANSWERS)
.withoutProcedureColumnMetaDataAccess()
.declareParameters(
// etc
我有执行某些存储过程的代码。 mssql-jdbc
连接到 Microsoft 的驱动程序 SQL 使用服务器数据库。
这里是简化的代码
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
吗?
我刚刚找到了答案,也许这对某些人有用。我们需要避免 3 次调用的是 withoutProcedureColumnMetaDataAccess()
for SimpleJdbcCall
。
像这样
SimpleJdbcCall getQACall = simpleJdbcCallFactory.create(jdbcTemplate)
.withSchemaName(SCHEMA_ARTICLE)
.withProcedureName(SP_GET_ALL_QUESTIONS_ANSWERS)
.withoutProcedureColumnMetaDataAccess()
.declareParameters(
// etc