SimpleJdbcCall: вызов двух хранимых процедур в приложении зависания класса - PullRequest
0 голосов
/ 23 октября 2019

Я использую SimpleJdbcCall для вызова двух хранимых процедур в двух разных функциях, используя JdbcTemplate. Первый Stored procedure вызов становится успешным, но второй Stored procedure вызов просто зависает, и в журнале появляется следующее сообщение, и ничего не идет вперед:

2019-10-23 02:00:33,043 DEBUG [http-nio-8080-exec-13:org.springframework.jdbc.datasource.DataSourceUtils] - Fetching JDBC Connection from DataSource

Вот исходный кодчасть конфигурации и кода

DataSourceConfig.java

@Configuration
public class DataSourceConfig {
    @Autowired
    private DataSource dataSource;

    @Bean
    public JdbcClientDetailsService jdbcClientDetailsService() {
        return new JdbcClientDetailsService(dataSource);
    }

}

OAuth2AuthorizationServerConfigurer

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private JdbcClientDetailsService jdbcClientDetailsService;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
//        clients.jdbc(dataSource);
        clients.withClientDetails(jdbcClientDetailsService);
    }
}

Класс, где два Stored Proceduresзвонят и приложение зависает при втором Stored Procedure звонке. (Первый stored procedure вызов выполняется. Если в его результате не найдено данных, он перейдет в блок else, который в данный момент выполняется)

CompanyService.java

@Component
public class CompanyService {

    @Autowired
    private JdbcTemplate jdbcTemplate;


    private static Logger logger = LoggerFactory.getLogger(CompanyService.class);


    public CompanyInfo getCompanyDetails(Integer companyId){

        SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate);
        simpleJdbcCall.withSchemaName("foo")
                .withCatalogName("foo_pkg")
                .withProcedureName("SELECT_COMPANY"); //select company Stored Procedure

        SqlParameterSource in = new MapSqlParameterSource()
                .addValue("companyId", companyId)
                .addValue("name",null)
                .addValue("uuid",null);
        try {
            Map<String, Object> out = simpleJdbcCall.execute(in);
            return //some method to convert out into CompanyInfo
        }catch (DataAccessException ex){
            logger.error("getCompanyDetails"+ex.getMessage());
            return null;
        }
    }

    public CompanyInfo registerCompany(RegisterCompany registerCompany) {
        CompanyInfo companyInfo = getCompanyDetails(registerCompany.getCompanyId());
        if(companyInfo!=null){
            //TODO: throw an exception
        }
        else{
            SimpleJdbcCall mergeJdbcCall = new SimpleJdbcCall(jdbcTemplate);
            mergeJdbcCall.withSchemaName("foo")
                    .withCatalogName("foo_pkg")
                    .withProcedureName("MERGE_COMPANY"); //Merge company Stored Procedure

            SqlParameterSource in = new MapSqlParameterSource()
                    .addValue("companyId", registerCompany.getCompanyPartyClassId())
                    .addValue("name",getName())
                    .addValue("uuid",getUuid());

            Map<String, Object> out = mergeJdbcCall.execute(in); //It's getting hang up at this level

        }
        return null;
    }
}

Какую конфигурацию я здесь пропустил, что вызывает проблему. Я также ознакомился с подробностями SimpleJdbcCall, которые описывают

A SimpleJdbcCall is a multi-threaded, reusable object representing a call to a stored procedure or a stored function.

, поэтому я создал два разных объекта этого класса. Попытка определить его на уровне класса, но проблема остается той же. Это тот случай, когда SimpleJdbcCall работает для одного звонка в одном классе? Каковы другие альтернативы, которые я могу использовать? (Кроме PreparedStatement)

...