русские блоги

## Сначала измените глобальное значение 31536000, восстановит исходное значение после перезапуска

установить глобальное wait_timeout=31536000;

5 лет, 2 месяца назад

Не удалось открыть соединение JDBC для транзакции; вложенное исключение — java.sql. SQLException: javax.resource. ResourceException: IJ000453: невозможно получить управляемое соединение для Java:

7 золотых знаков43 серебряных знака61 бронзовый знак

спросил 23 июля 2018 в 7:57

1 золотой знак1 серебряный знак4 бронзовых знака

Связанные

ещё горячие вопросы

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой использования файлов cookie.

Я работаю над очень большим, но плохо реализованным проектом, и у нас есть большая проблема с производительностью, связанная с базой данных.
Мы используем Oracle, exadata и бла-бла-бла.
Сервер приложений: кот
Дайвер: ojdbc6

И следующие конфиги:

Приложение имеет почти 15 модулей, работающих независимо, но также некоторые модули включают в себя другие и используют их источники данных.

Проблема в том, что 15 модулей должны иметь 200 соединений, но с этими спагетти каждый из них также требует соединений включенных модулей.

это суп из связей!

Не удалось открыть соединение JDBC для транзакции; вложенное исключение — java.lang. IllegalArgumentException: соединение не должно быть нулевым

.

Проверка базы данных большинства модулей требует 200 подключений, но имеет только 7 активных и 197 неактивных.

Я не могу найти нужную конфигурацию, чтобы освободить неактивные.

Я использовал InactivityTimeout и AbandonedConnectionTimeout, но проблема не устранена.

CannotCreateTransactionException: не удалось открыть соединение JDBC для транзакции; вложенное исключение — com.mysql.jdbc.Exceptions.jdbc4. CommunicationsException: сбой канала связи

Последний пакет, успешно полученный от сервера, был 2 297 746 миллисекунд назад. Последний пакет, успешно отправленный на сервер, был 4 миллисекунды назад.

Что, создать транзакцию, не удалось, соединение протоколов протоколов не удалось? Что?

РУССКИЕ БЛОГИ

Найдите информацию, возможно, что Wait_Timeout установлен слишком маленьким. После попытки увеличить значение wait_timeout система возвращается к обычному состоянию. Или измените информацию о схеме соединения соединений.

Так что такое wait_timeout?

Как база данныхНачать сначалаБаза данных IDLE Соединение увеличивает максимальное время времениБаза данных заставит существующую ссылку. По умолчанию по умолчанию «Wait_timeout» составляет 28800 секунд по умолчанию, означал, что если подключение простаивается в течение более 8 часов, MySQL автоматически отключает соединение и соединяет пул, но, кажется, это соединение все еще действительно (потому что достоверность соединений не появилась), приведенная выше ошибка, возникшая при использовании приложения.

Там есть параметры, используемые для интерактивных соединений. Wait_timeout предназначен для неинтерактивных соединений. Так называемое интерактивное соединение используется в функции MySQL_REAL_CONNECT(), которая использует опцию Client_interactive.

Говорите прямо, подключайте данные сайтов через клиент MySQL для интерактивного соединения и подключайте данные сайтов через соединения данных сайтов JDBC. Быть

При запуске соединения в соответствии с типом соединения подтвердите, что значение переменного сеанса WIET_TIMEOUT ненаблюдается в глобальной переменной wience_timeout илиinteractive_timeout.

Следовательно, информация о настройке данных базы данных меняется, и необходимо также перезапустить приложение, чтобы сделать информацию о подключении.

org.springframework.transaction. CannotCreateTransactionException: не удалось открыть соединение JDBC для транзакции; вложенное исключение — org.apache.tomcat.dbcp.dbcp. SQLNestedException: невозможно получить соединение, ошибка пула. Тайм-аут ожидания простоя объекта

Судя по сообщению об ошибке, проблема с подключением к пулу соединений

В соответствии с фактической работой подтверждено, что пул соединений недостаточен. После того, как программа получает операцию завершения соединения с базой данных, соединение не закрывается вовремя.

String sql = «select * from ln_offer_test_»+yyyymmdd+» awhere a.status=?»;
Запрос SQLQuery = this.getSession().createSQLQuery(sql);
query.setString(0, статус);
список = запрос.список();
список возврата;

Обнаружил, что не закрыл сессию, плюс выкл, проблема решена

String sql = «select * from ln_offer_test_»+yyyymmdd+» awhere a.status=?»;
Сеанс сеанса = this.getSession();
Запрос SQLQuery = session.createSQLQuery(sql);
query.setString(0, статус);
список = запрос.список();
сеанс.закрыть();
список возврата;

подведем итог:

1 Почему вы сообщаете после 20 операций?

Свойства, связанные с пулом соединений, задаются в проекте

maxActive/ maxWait: максимальное количество активных соединений, то есть максимальное количество соединений в пуле соединений. Когда программа превышает количество подключений и затем получает соединение, она ставится в очередь. Когда очередь очень высокая maxWait, выдается исключение.

Эти соединения также можно принудительно закрыть, установив параметры пула соединений. Параметры пула соединений должны быть установлены в соответствии с фактическим использованием проекта. Лучше закрыть соединение в соответствии с бизнес-процессингом, что более разумно. Понять настройки пула соединений можно по ссылке ниже

.

2 Почему Spring Management не закрывает эти соединения автоматически?

Причина очень проста: поскольку getSession был упакован Spring, пакет Spring представляет собой метод getHibernateTemplate, который является наиболее важным отличием между getSession и getHibernateTemplate. Вышеупомянутую проблему также можно решить с помощью getHibernateTemplate. Итак, вопрос в том, почему бы не использовать getHibernateTemplate? Конечно, метод getSession более применим. Если вам интересно, вы можете узнать об этом больше.

2 ответа

Убедитесь, что значения минимального размера пула и максимального размера пула для соответствующего источника данных установлены в соответствии с нагрузочным тестированием приложения и соединения закрываются после использования внутри кода приложения.

ответил 24 июля 2018 в 9:56

Если вам нужно указать основную причину сбоя, я могу придумать как минимум две причины:

ответил 23 июля 2018 в 8:08

5 золотых знаков84 серебряных знака134 бронзовых знака

Клиент разрешает эту проблему

Чтобы решить это заключение, нам необходимо выбрать некоторые конфигурации для обеспечения стабильности соединения при настройке пула соединений базы данных. Здесь представлены друиды в качестве примера, соответствующая внешний вид выглядит следующим образом (Больше настроек):

Чтобы избежать простого увеличения времени, чем максимальное время простоя, мы установили три конфигурации:

запрос проверки: ВЫБРАТЬ 1
testWhileIdle: правда
timeBetweenEvictionRunsMillis: 28000

вtimeBetweenEvictionRunsMillisНужно меньше, чем mysqlwait_timeout。

Однако этот метод не может избежать перезапуска, но данные общей базы данных не будут часто перезапускаться, а воздействие невелико. Если он не часто перезапускается, он может быть установлен testOnBorrow Когда приложение подключено, определите подключение к соединению, но воздействие заключается в том, что производительность снижается, и необходимо скрыть фактический спрос.

Товар. mysql. jdbc. исключения. jdbc4. Исключение связи

orgspringframeworktransactionCannotCreateTransactionException Не удалось открыть вложенное исключение транзакции JDBC Connection: commysqljdbcExceptionsjdbc4CommunicationsException Последнее
пакет успешно получен от сервера миллисекунды назад. Последний пакет, успешно отправленный на сервер миллисекунды назад, длиннее, чем настроен сервер.
значение Вам следует рассмотреть возможность истечения срока действия и/или проверки действительности соединения перед использованием в вашем приложении, увеличивая настроенные на сервере значения тайм-аутов клиента или используя
свойство соединения ConnectorJ, чтобы избежать проблемorgspringframeworkjdbcdatasourceDataSourceTransactionManagerDataSourceTransactionManagerjava
в orgspringframeworktransactionsupportAbstractPlatformTransactionManagerAbstractPlatformTransactionManagerjava
в orgspringframeworktransactioninterceptorTransactionAspectSupportTransactionAspectSupportjava
в orgspringframeworktransactioninterceptorTransactionAspectSupportTransactionAspectSupportjava
в orgspringframeworktransactioninterceptorTransactionInterceptorTransactionInterceptorjava
в orgspringframeworkaopframeworkReflectiveMethodInvoctionReflectiveMethodInvoctionjava
в orgspringframeworkaopframeworkCglibAopProxy$DynamicAdvisedInterceptorCglibAopProxyjava
в orgspringframeworkcglibproxyMethodProxyMethodProxyjava
в orgspringframeworkaopframeworkCglibAopProxy$CglibMethodInvoctionCglibAopProxyjava
в orgspringframeworkaopframeworkReflectiveMethodInvoctionReflectiveMethodInvoctionjava
в sunreflectGeneratedMethodAccessor213Unknown Source
at sunreflectDelegatingMethodAccessorImplDelegatingMethodAccessorImpljava
в javalangreflectMethodMethodjava
в orgspringframeworkwebmethodsupportInvocableHandlerMethodInvocableHandlerMethodjava
в orgspringframeworkwebmethodsupportInvocableHandlerMethodInvocableHandlerMethodjava
в orgspringframeworkwebservletmvcmethodannotationServletInvocableHandlerMethodServletInvocableHandlerMethodjava
в orgspringframeworkwebservletmvcmethodannotationRequestMappingHandlerAdapterRequestMappingHandlerAdapterjava
в orgspringframeworkwebservletmvcmethodannotationRequestMappingHandlerAdapterRequestMappingHandlerAdapterjava
в orgspringframeworkwebservletmvcmethodAbstractHandlerMethodAdapterAbstractHandlerMethodAdapterjava
в orgspringframeworkwebservletDispatcherServletDispatcherServletjava
в orgspringframeworkwebservletDispatcherServletDispatcherServletjava
orgspringframeworkwebfilterOncePerRequestFilterOncePerRequestFilterjava
в orgapachecatalinacoreApplicationFilterChainApplicationFilterChainjava
в orgapachecatalinacoreApplicationFilterChainApplicationFilterChainjava
в orgspringframeworkwebfilterHiddenHttpMethodFilterHiddenHttpMethodFilterjava
в orgspringframeworkwebfilterOncePerRequestFilterOncePerRequestFilterjava
в orgapachecatalinacoreApplicationFilterChainApplicationFilterChainjava
в orgapachecatalinacoreApplicationFilterChainApplicationFilterChainjava
в comiboxchainpubxlogcorefilterCidFilterCidFilterjava
в orgapachecatalinacoreApplicationFilterChainApplicationFilterChainjava
javautilconcurrentThreadPoolExecutor$WorkerThreadPoolExecutorjava
в orgapachetomcatutilthreadsTaskThread$WrappingRunnableTaskThreadjava
в javalangThreadThreadjava
Вызвано commysqljdbcExceptionsjdbc4CommunicationsException Последний пакет, успешно полученный от сервера, был миллисекунды назад. Последний пакет, успешно отправленный на сервер миллисекунды назад, длиннее, чем настроенное на сервере значение. Вам следует рассмотреть возможность истечения срока действия и проверки действительности соединения перед использованием в вашем приложении, увеличивая сервер. настроенные значения тайм-аутов клиента или использование свойства соединения ConnectorJ, чтобы избежать проблем
at sunreflectGeneratedConstructorAccessor185Неизвестный источник
at sunreflectDelegatingConstructorAccessorImplDelegatingConstructorAccessorImpljava
в javalangreflectConstructorConstructorjava
в commysqljdbcUtilUtiljava
в commysqljdbcSQLErrorSQLErrorjava
в commysqljdbcMysqlIOMysqlIOjava
в commysqljdbcMysqlIOMysqlIOjava
в commysqljdbcMysqlIOMysqlIOjava
в commysqljdbcConnectionImplConnectionImpljava

Проверил причину, оказалась проблема с настройкой таймаута MySQL. Соединение с базой данных долгое время простаивало, что привело к автоматическому отключению. Время ожидания MySQL по умолчанию составляет 28880 секунд (8 часов). Вы можете использовать: показать глобальные переменные, такие как «wait_timeout»; просмотр

Решение

Чтобы устранить это исключение, нам нужно выполнить некоторую настройку, чтобы проверить правильность соединения при настройке пула подключений к базе данных, вот пример Druid

Чтобы избежать отключения из-за чрезмерного простоя, превышающего максимальное время простоя, мы установили три конфигурации:

времяМеждуВыселениемРуныМиллис
validationQuery выбрать из двойного
testWhileIdle

Среди них timeBetweenEvictionRunsMillis должен быть меньше, чем wait_timeout в mysql.

Однако этот метод не позволяет избежать перезапуска, но обычно база данных перезапускается нечасто, что оказывает незначительное влияние. Если вам приходится часто перезагружаться, вы можете установить testOnBorrow, то есть при подаче заявки на соединение сначала попробуйте, доступно ли соединение, но это влияет на снижение производительности, что требует разумного выбора, основанного на реальных потребностях.

Другие решения, упомянутые в Интернете: (мое не подействовало)

Вид Если вы не используете режим гибернации, добавьте параметры в  url-адрес соединения autoReconnect

четыре. Худшее решение

Сбой канала связи,Последний пакет, успешно полученный от сервера, был * миллисекунду назад. Последний пакет, успешно отправленный на сервер, был *миллисекунду назад。

Ошибка также предложит вам изменить wait_timeout или использовать свойство autoReconnect Connector/J, чтобы избежать ошибки.

Проверив некоторую информацию, я обнаружил, что многие люди сталкивались с этой проблемой. Большинство из них используют только метод пула соединений. Эта проблема должна быть сложной для коротких соединений. Причина этой проблемы:

1. Согласно неверному запросу вы можете использовать атрибут autoReconnect в URL-адресе JDBC. В реальном тесте использовались autoReconnect=true&failOverReadOnly=false, но это не сработало. Использовалась версия 5.1. Это может быть всего 4. Предыдущая версия действительна.

2. Нет другого выхода, кроме как изменить параметры MySQL. Максимальное время ожидания wait_timeout — 31536000, что составляет 1 год. Добавьте в my.cnf:

Перезапуск вступит в силу, вам необходимо изменить эти два параметра одновременно.

Анализ причин

Это исключение связано с тем, что источник данных проекта был закрыт и поток не может вставить данные в базу данных. Поскольку это тестовый пример, в процессе разработки после того, как основной поток передает задачу в пул потоков, он выполняется напрямую и закрывает источник данных. В реальном производстве основной поток не будет закрыт, поэтому этой проблемы не возникнет.

Предисловие

Использовать пул потоков для вставки датаграммы. Не удалось открыть соединение JDBC из-за исключения транзакции

.

Можно открыть JDBC Connection; вложенное исключение com.alibaba.druid.pool. DataSourceClosedException: источник данных уже закрыт в пятницу, сентябрь :: CST

Решение для MySQL-сервера.

Непосредственно изменить соответствующую информацию о схеме

## Просмотр конфигурации MySQL

показывать глобальные переменные, такие как «wait_timeout»;

РУССКИЕ БЛОГИ

После того, как основной поток выбросит задачу в пул потоков, поспите некоторое время, а затем закройте процесс и закройте источник данных после того, как пул потоков завершит обработку данных.

AcceptorSaveOrderThread AcceptorSaveOrderThread(orderService,receiveConsumptionData)
//Дождитесь выполнения дочернего потока перед выполнением кода основного потока
();
OrderConstantFIXED_THREAD_POOLexecute();
//Оставляем основной поток на 10 секунд
спать();

Похоже, что пароль не установлен и имеет значение null в SimplePBEConfig.java (строка № 434), что вызывает исключение NullPointerException.

Ссылка — https://github.com/jboss-fuse/jasypt/blob/master/jasypt/src/main/java/org/jasypt/encryption/pbe/config/SimplePBEConfig.java

Ответил — Дханрадж

## Измени мое. cnf, чтобы убедиться, что MySQL все еще принимается

Interactive_Timeout = 31536000 # Эта информация не может быть изменена

Время обучения изменено до 1 года.

Выпуск

У меня есть модульный тест, который при запуске выдает следующую ошибку:

В файле application.properties указаны правильные данные о подключении к моей базе данных. Что может быть причиной этого?