У нас есть приложение для весенней загрузки с базой данных Spring JPA и Sybase ASE. Мы использовали Hikari в качестве пула соединений. У нас написана 1 хранимая процедура, которая вызывается каждые 4 минуты.
Конфигурация Hikari:
datasource:
type: com.zaxxer.hikari.HikariDataSource
data-source-class-name: com.sybase.jdbc4.jdbc.SybDataSource
driver-class-name: com.sybase.jdbc4.jdbc.SybDriver
url: xxx-yyy-zzz
username: xxx-yyy-zzz
password: xxx-yyy-zzz
hikari:
maximum-pool-size: 10
minimum-idle: 1
Проблема в том, что я получаю ошибку ниже после каждых 10 вызовов хранимой процедуры как Я настроил размер пула 10.
> Caused by: java.sql.SQLTransientConnectionException: HikariPool-2 -
> Connection is not available, request timed out after 30007ms. at
> com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:669)
>
> org.springframework.dao.DataAccessResourceFailureException: Unable to
> acquire JDBC Connection; nested exception is
> org.hibernate.exception.JDBCConnectionException: Unable to acquire
> JDBC Connection
Код записывается следующим образом:
@Autowired
@Lazy
Smsxyz smsxyzImpl;
@PostConstruct
@Scheduled(fixedRate = 240000)
public void completeStatus() {
try {
smsxyzImpl.checkStatus(Constants.STATUS_PER_SCAN, Constants.STATUS_EXPIRY_DURATION, -1L);
} catch (Exception e) {
e.printStackTrace();
}
}
@Autowired
private EntityManager entityManager;
@Override
//@Transactional
public Integer checkStatus(Integer count, Integer expiry, Long userId) {
StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("status.check");
query.setParameter("@status_count", count);
query.setParameter("@status_expiry", expiry);
query.setParameter("@user_id", userId);
Integer outputValue= (Integer) query.getOutputParameterValue("@return_status");
return outputValue;
}
- Если я удалю @Transactional, он будет выполняться 10 раз (как размер пула hikari равно 10), и после этого он выдает исключение, как упомянуто выше.
- Если я сохраню @Transactional, он работает нормально без исключения, но не обновляет базу данных.
- Если я запустил сохраненный процедура вручную прямо из базы данных, тогда она работает отлично, что означает отсутствие проблем в хранимой процедуре.
Я подозреваю, что она не разрывает соединение. Поэтому я закрыл соединение с помощью entitymanager.close (), но это не сработало. Я потратил много дней на эту проблему, но не повезло. Может ли кто-нибудь сообщить мне, что я здесь делаю не так?