#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 минут и не дали ей шанса. Администратор базы данных, зависающий поблизости во время выполнения этого теста, может сказать вам, так ли это