Ошибка ввода-вывода: Время чтения сокета истекло только тогда, когда в базе данных выполняется запрос JdbcTemplate с инструкцией IN

#spring-boot #jdbctemplate #hikaricp

Вопрос:

Всем Привет,

Я тестирую производительность простой конечной точки Rest с 60 транзакциями в секунду,и из 100 тысяч обращений только 100 завершаются неудачей со следующей ошибкой, мы испробовали все способы увеличения максимального срока службы и улучшения памяти базы данных, по-прежнему получая ошибку тайм-аута чтения сокета:

Запрос:

     >  select
    >         store,
    >                 product,quantity
    >                        from
    >                 store
    >             where store in (: stores) and product in (: products);
 

Мои настройки подключения следующие:

     **application.properties** 
    
        datasources.spring.poolName= springDB
        datasources.spring.connectionTimeout= 100000
        datasources.spring.maximumPoolSize= 30
        datasources.spring.idleTimeout= 30000
        datasources.spring.maxLifetime= 600000
        datasources.spring.validationTimeout= 1000
        datasources.spring.leakDetectionThreshold= 90000
        datasources.spring.autoCommit= true
        datasources.spring.minimumIdle= 30
        datasources.spring.connectionTestQuery= SELECT 1 FROM DUAL
        datasources.spring.driverClassName=oracle.jdbc.driver.OracleDriver
 

Исключение:

  • Ошибка ввода-вывода: Время ожидания чтения сокета истекло
            at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:747)
           at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:904)
           at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1082)
           at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1737)
           at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1692)
           at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:300)
           at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive(PoolBase.java:165)
           at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:185)
           at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:161)
           at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128)
           at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)
           at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)
           at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
           at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:612)
           at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:669)
           at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:694)
           at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:748)
           at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:216)
           at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:223)
 

Комментарии:

1. Я не знаю, что вызывает тайм-ауты вашего сокета. Я знаю, что ни одно из свойств, которые вы там устанавливаете, не имеет особого отношения к сокету. Все они настраивают пул подключений. Погуглите вокруг своего драйвера Oracle, чтобы выяснить, как настроить его sockettimeout, а затем выясните, как включить это в конфигурацию sprint. Я не думаю, что это поможет, если я правильно прочитаю документы Oracle, они по умолчанию равны 10 минутам: docs.oracle.com/cd/E57185_01/ESTUG/apbs02s23.html . Запишите фактический запрос, который вы выполняете, и запустите его вручную. Я держу пари, что он медленный и находится в противоречии с другими запросами..

2. Ваши жертвы получают резервные копии в базе данных. База данных в конечном итоге дошла бы до вас…но с вашей стороны вы истекли на 10 минут и не дали ей шанса. Администратор базы данных, зависающий поблизости во время выполнения этого теста, может сказать вам, так ли это