Оригинал: Miss Sister Taste (идентификатор публичной учетной записи WeChat: xjjdog), добро пожаловать, пожалуйста, сохраните источник для перепечатки.
Иногда из-за сложности бизнеса сборка некоторых данных в JVM приводит к большой трате ресурсов. Например, запросите список из MySQL, а затем прокрутите код, чтобы запросить базу данных для заполнения некоторых полей.
Этот метод сборки данных, помимо проблемы эффективности выполнения, имеет тенденцию занимать больше памяти, что оказывает большую нагрузку на весь вычислительный узел JVM, а иногда даже вызывает переполнение памяти. Итак, некоторые сравненияBullXРазработчики используют очень сложный SQL, чтобы перенести эти трудоемкие операции на базу данных.
Плохая база данных стала последней преградой. Кто вообще делает конфигурацию БД выше? Заслуживать это.
Но, к сожалению, база данных также должна пройти трудоемкие операции для выполнения этих действий. Если поток Java проявляет нетерпение, он напрямую вернет тайм-аут пользователю, и в этом случае сбитый с толку пользователь инициирует повторную попытку.
Вы должны знать, что тайм-аут на стороне Java не означает, что инициированный запрос завершается.В некоторых сценариях с высоким уровнем параллелизма плохая база данных будет выполнять некоторые трудоемкие медленные запросы и вычислять некоторые данные, которые никто не знает.
Плохая база данных.
1. Как установить время ожидания базы данных
Для базы данных mysql доступны два параметра:
connectTimeout
По умолчанию: 0, единица измерения: миллисекунды
Настройте время ожидания соединения, которое настраивается с помощью метода connect(SocketAddress endpoint, int timeout) объекта Socket.
socketTimeout
По умолчанию: 0, единица измерения: мс
Настройте время ожидания сокета, которое настраивается с помощью метода setSoTimeout(int timeout) объекта Socket.
Пример:
jdbc:mysql://xxx.xx.xxx.xxx:3306/database?connectTimeout=60000&socketTimeout=60000
2. Значение тайм-аута
Когда база данных не работает или сеть ненормальна, необходим тайм-аут сокета, управляемый jdbc. Из-за структуры TPC/IP сокеты не могут обнаруживать сетевые ошибки, поэтому приложения не могут обнаружить разрыв соединения с базой данных. Если время ожидания сокета не установлено, приложение будет ждать, пока база данных вернет результат. Чтобы избежать мертвых соединений, сокет должен установить тайм-аут, Установив тайм-аут, вы можете предотвратить ситуацию ожидания сетевой ошибки и сократить время сбоя. Общий пул соединений с базой данных будет обеспечивать функцию проверки ссылок, но часто используемое соединение не проверяется.
3. Настроенные тесты
3.1, время ожидания подключения
При установке connectTimeout=1 произошла ошибка при установлении соединения с базой данных. Это значение допустимо при установке соединения с базой данных.
3.2, время ожидания сокета
Создайте медленную проверку и установите socketTimeout меньше, чем время медленной проверки, например: socketTimeout=1000&connectTimeout=1000, время выполнения медленной проверки составляет 100 с.
При выполнении запроса журнал ключевых исключений:
...WARN o.s.jdbc.support.SQLErrorCodesFactory 218 - Error while extracting database name - falling back to empty error codes
org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 1,029 milliseconds ago. The last packet sent successfully to the server was 1,006 milliseconds ago.
Caused by: java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:171)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:101)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:144)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:174)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3008)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3469)
... 137 common frames omitted
1) Тайм-аут чтения сокета цепочки исключений -> CommunicationsException -> Ошибка при извлечении имени базы данных — возврат к пустым кодам ошибок. Преобразование исключений Spring SQLErrorCodesFactory завершилось неудачно, так как коды ошибок не были возвращены
2) Параметр connectTimeout больше не будет действовать после установления соединения
3)SHOW PROCESSLIST
Глядя на запрос, выполняемый в mysql, обнаруживается, что медленная проверка все еще выполняется, то есть для медленной проверки отключение в это время не прерывает выполнение медленной проверки.
Это как найти девушку, чтобы жениться, посадить семя, но в конце концов это просто потому, что дверь не та. Но семя в данном случае незаметно принесло свои плоды.
4. Резюме
Параметр socketTimeout имеет значение установки.После того, как время запроса превысит определенный порог, отключение соединения может предотвратить постоянное занятие соединения клиента.
Кроме того, для мониторинга медленной проверки такого рода исключения не учитывают напрямую время выполнения (потому что соединение с клиентом отключено и sql не выполнялся), а можно судить отдельно по типу исключения. медленный контроль проверки, есть очень важное практическое значение.
Об авторе:Мисс сестра вкус(xjjdog), публичная учетная запись, которая не позволяет программистам идти в обход. Сосредоточьтесь на инфраструктуре и Linux. Десять лет архитектуры, десятки миллиардов ежедневного трафика, обсуждение с вами мира высокой параллелизма, дающие вам другой вкус. Мой личный WeChat xjjdog0, добро пожаловать в друзья для дальнейшего общения.