Получение подключения к HikariPool-2 недоступно, время ожидания запроса истекло - PullRequest
0 голосов
/ 06 августа 2020

У нас есть приложение для весенней загрузки с базой данных 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;
    }
  1. Если я удалю @Transactional, он будет выполняться 10 раз (как размер пула hikari равно 10), и после этого он выдает исключение, как упомянуто выше.
  2. Если я сохраню @Transactional, он работает нормально без исключения, но не обновляет базу данных.
  3. Если я запустил сохраненный процедура вручную прямо из базы данных, тогда она работает отлично, что означает отсутствие проблем в хранимой процедуре.

Я подозреваю, что она не разрывает соединение. Поэтому я закрыл соединение с помощью entitymanager.close (), но это не сработало. Я потратил много дней на эту проблему, но не повезло. Может ли кто-нибудь сообщить мне, что я здесь делаю не так?

...