SimpleJDBCCall Spring没有执行

时间:2018-02-12 14:19:44

标签: java spring-mvc spring-boot spring-transactions

我有这个方法

public void importarAdiantamento(ArrayList<LayoutArquivo> arquivos, Usuario usuario) throws Exception {

        try {

            for(LayoutArquivo arquivo : arquivos) {
                DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");    
                SqlParameterSource in = new MapSqlParameterSource()
                        .addValue("DATAVCM", new java.sql.Date(fmt.parse(arquivo.getVencimento()).getTime()))
                        .addValue("VALOR", arquivo.getValor())
                        .addValue("MOTIVO", arquivo.getCodMotivo())
                        .addValue("EMPRESA", arquivo.getCodEmpresa())
                        .addValue("NPARCELA", 1)
                        .addValue("TOTALPARCELA", 1)
                        .addValue("DOCUMENTO", arquivo.getDocumento())
                        .addValue("FUNCIONARIO", arquivo.getCodFunc())
                        .addValue("HISTORICO", "VALE IMPORTADO")
                        .addValue("EXPORTAR", 0)
                        .addValue("USUARIO", usuario.getCodigousuario())
                        .addValue("DUPLIC", 0)
                        .addValue("PROTOCOLO", "0");


                SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)                                          
                        .withProcedureName(AdiantamentoQueries.importarAdiantamento())
                        .declareParameters(
                                new SqlParameter("DATAVCM", Types.DATE),
                                new SqlParameter("VALOR", Types.NUMERIC),
                                new SqlParameter("MOTIVO", Types.NUMERIC),
                                new SqlParameter("EMPRESA", Types.NUMERIC),
                                new SqlParameter("NPARCELA", Types.NUMERIC),
                                new SqlParameter("TOTALPARCELA", Types.NUMERIC),
                                new SqlParameter("DOCUMENTO", Types.VARCHAR),
                                new SqlParameter("FUNCIONARIO", Types.NUMERIC),
                                new SqlParameter("HISTORICO", Types.VARCHAR),
                                new SqlParameter("EXPORTAR", Types.NUMERIC),
                                new SqlParameter("USUARIO", Types.NUMERIC),
                                new SqlOutParameter("DUPLIC", Types.NUMERIC),
                                new SqlParameter("PROTOCOLO", Types.VARCHAR)
                         );


                System.out.println("executando o documento " + arquivo.getDocumento());
                jdbcCall.execute(in);
                System.out.println("terminou de executar o documento" + arquivo.getDocumento());

            }


        }catch (Exception e) {
            throw new Exception(e);
        }
    }

抵达jdbcCall.execute(in);行时 执行挂起就像你在等待而不是继续。 不知道发生了什么

我在控制台中打印信息,只打印了

executando o documento 72527

由于我只能在成功完成所有for条记录时提交,因此我放置了@Transactional注释,但它不起作用

运行后这个方法是java,这是我数据库中的一个会话:

enter image description here

2 个答案:

答案 0 :(得分:1)

1)如果您在for循环中运行jdbcCall,最好在jdbcCall之外声明for loop对象。您不需要在每次迭代中创建此对象。

2)当您使用@Transactional时,该方法不应使用try-catch块处理异常。因此,请删除try-catch块并注释下面提到的方法。

@Transactional(rollbackFor=Exception.class)

答案 1 :(得分:1)

  • 您是否在数据库中看到您的交易是否正在运行?
  • 您是直接在数据库中执行该过程而不是在java中运行吗?
  • 并不存在任何并行运行的进程导致数据库锁定?

希望我帮助过你。