Я использую 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)