存储过程调用上未清除Out参数



我的问题如下:

我的服务在作为参数传递的项上循环。对于每一项,我打两个电话。我的第一次价格通知给了我9999,这意味着没有任何回报。这很好——这是可能的。我的股票认购操作完美,我得到了正确的股票价值回报。在第二次迭代中,我的价格调用返回与上一次股票调用相同的值。

所以,我得到9999的价格,然后150的股票,然后150价格。让我震惊的是,缺货的标准杆是第6杆,而缺货的标准棒是第8杆。不知道它将如何在不同的位置保持这种价值。

我的jdbctemplate似乎没有被清除,或者它存储了以前的out参数。这是涉及的代码:

MyService.java

@Service
public class MyService extends BaseService implements MyInterface{
    protected static final Logger logger = LoggerFactory.getLogger(MyService.class);
    @Autowired
    private MyDAO myDAO;
    public myResponse checkOrder(args...)  
    {  
        for(something in args){
                // PRICE
                // Grab price data
                LinkedHashMap<String, Object> priceCallInParams = new LinkedHashMap<String, Object>();
                priceCallInParams .put("param1", "param1val");
                priceCallInParams .put("param2", "param2val");
                priceCallInParams .put("param3", "param3val");
                priceCallInParams .put("param4", "param4val");
                priceCallInParams .put("param5", "param5val");
                LinkedHashMap<String, Object> priceCallOutParams = new LinkedHashMap<String, Object>();
                priceCallOutParams .put("price", "0");
                
                logger.debug("Getting data...");
                Map<String, Object> priceData = new HashMap<String, Object>();
            
                priceData = myDAO.checkPrice(priceCallInParams , priceCallOutParams );
                
                BigDecimal unitPrice = new BigDecimal(9999);
                if (!priceData .get("PRCE").toString().trim().equals("")){
                    unitPrice = new BigDecimal(priceData.get("PRCE").toString().trim());
                }
                System.out.println("PRC - "+unitPrice);
                
                
                // AVAILABLE STOCK
                // Grab check stock data
                LinkedHashMap<String, Object> checkStockInParms = new LinkedHashMap<String, Object>();
                checkStockInParms.put("param1", "param1val");
                checkStockInParms.put("param2", "param2val");
                checkStockInParms.put("param3", "param3val");
                checkStockInParms.put("param4", "param4val");
                checkStockInParms.put("param5", "param5val");
                checkStockInParms.put("param6", "param6val");
                checkStockInParms.put("REQQTY", "123");
                LinkedHashMap<String, Object> checkStockOutParms = new LinkedHashMap<String, Object>();
                checkStockOutParms .put("AVAILQTY", "0");
                checkStockOutParms .put("NEXTDUE"," ");
                checkStockOutParms .put("NEXTQTY","0");
                
                logger.debug("Getting data...");
                Map<String, Object> checkStockDat = new HashMap<String, Object>();
                checkStockDat = myDAO.checkStock(checkStockInParms , checkStockOutParms );

                
                // Output quantity
                int AvailQTY = Integer.valueOf(checkStockDat.get("AVAILQTY").toString().trim());
                if (reqBIT.getRequestedQuantity()>AvailQTY) {
                    resBIT.setConfirmedQuantity(AvailQTY);
                }
                else {
                    resBIT.setConfirmedQuantity(reqBIT.getRequestedQuantity());
                }
            }
    }

}

MyDAO.java

@Component
public class MyDAO extends BaseDAO{
    protected static final Logger logger = LoggerFactory.getLogger(OrderDAO.class);
    
    public Map<String, Object> checkStock(LinkedHashMap<String, Object> inparms, LinkedHashMap<String, Object> outparms){
        StringBuilder builtSQL = new StringBuilder();
        builtSQL.append("CALL ");
        builtSQL.append("checkstock ");
        
// just generates our param string (?,?,?...) 
builtSQL.append(DataUtilities.genParmPlaceholderStringFromTotal(inparms.size()+outparms.size()));
        
        return executeStoredProcedure(builtSQL.toString(), inparms, outparms);
    }
    
    public Map<String, Object> checkPrice(LinkedHashMap<String, Object> inparms, LinkedHashMap<String, Object> outparms){
        logger.debug("CheckPrcc Initiated");
        StringBuilder builtSQL = new StringBuilder();
        builtSQL.append("CALL ");
        builtSQL.append("checkprice ");
// just generates our param string (?,?,?...) 
builtSQL.append(DataUtilities.genParmPlaceholderStringFromTotal(inparms.size()+outparms.size()));
        return executeStoredProcedure(builtSQL.toString(), inparms, outparms);
    }
}

BaseDAO.java

public class BaseDAO{
    @Autowired
    protected JdbcTemplate jdbcTemplate;
        
    protected static final Logger logger = LoggerFactory.getLogger(BaseDAO.class);
    protected Map<String, Object> executeStoredProcedure(String SQL, LinkedHashMap<String, Object> inParams, LinkedHashMap<String, Object> outParams){
        
        Map<String, Object> result = new HashMap<String, Object>();
            List<SqlParameter> declaredParameters = new ArrayList<SqlParameter>();
            for (Map.Entry<String, Object> entry : inParams.entrySet()) {
                declaredParameters.add(new SqlParameter(entry.getKey().toString(), Types.CHAR));
            }
            for (Map.Entry<String, Object> entry : outParams.entrySet()) {
                declaredParameters.add(new SqlOutParameter(entry.getKey().toString(), Types.CHAR));
            }
            
           result = jdbcTemplate.call(new CallableStatementCreator() {
                public CallableStatement createCallableStatement(Connection connection)
                throws SQLException {
                    CallableStatement callableStatement = connection.prepareCall(SQL);
                    int index = 0;
                    for (Map.Entry<String, Object> entry : inParams.entrySet()) {
                        index++;
                        callableStatement.setString(index, entry.getValue().toString());
                    }
                    for (Map.Entry<String, Object> entry : outParams.entrySet()) {
                        index++;
                        callableStatement.registerOutParameter(index, Types.CHAR);  
                    }
                    return callableStatement;
    
                    }
                }, declaredParameters);
        return result;
    }
    
}

我的服务是从我的rest控制器调用的,它传递args(如果这很重要的话(。

我一直在绞尽脑汁,找不到任何关于这个问题的信息。我是spring boot和Java的新手。我不认为我做了太过分的事。

在我们的情况下,这是由我们的i系列引起的。如果没有要返回的数据,系统仍然会从内存中返回10个字符,这是它刚刚返回的最后一个值。解决方案是始终填充返回值以清除内存。

毕竟不是弹簧靴!

最新更新