Unable to acquire jdbc connection что это

Не удалось получить соединение JDBC в тесте интеграции при использовании сети моста Docker

когда я запускаю maven test локально передается. Но получил эту ошибку, когда я запускаю ее на сервере CI.

при запуске локального теста все они прошли, используется настройка теста maven по умолчанию, предоставляемая IntelliJ IDEA.
Поскольку ошибка жалуется на подключение к базе данных, поэтому я проверил Jenkins Audit на плагин базы данных. Соединение Успешно!

Unable to acquire jdbc connection что это. Смотреть фото Unable to acquire jdbc connection что это. Смотреть картинку Unable to acquire jdbc connection что это. Картинка про Unable to acquire jdbc connection что это. Фото Unable to acquire jdbc connection что это

параметр подключения в my application.properties также соответствует этому

MySQL в URL-адресе является именем контейнера MySQL docker. Если изменить его с localhost или частный IP в docker container inspect mysql сообщение об ошибке то же самое, в то время как Stacktrace немного отличается на последних двух строках.

другой, я думаю, является хостом в URL, localhost используется для локального теста. В то время как сервер Jenkins использовал сеть Docker bridge.

в состояние контейнера:

когда я запускаю тест JUnit в IntelliJ, он иногда терпит неудачу в локальной среде. Журнал ошибок выглядит так:

поиск в сообщении об ошибке найдите аналогичный вопрос, но с другим вложенным исключением:

не удалось открыть JPA EntityManager для транзакции; вложенным исключением является javax.стойкость.PersistenceException

SpingREST: не удалось открыть JPA EntityManager для транзакции; вложенным исключением является org.hiberna

не удалось открыть JPA EntityManager для транзакции; org.зимовать.исключение.GenericJDBCException: не удалось открыть соединение

не удалось открыть JPA EntityManager для транзакции весной

все они-о nested exception is javax.persistence.PersistenceException
Но!—12—> моя ситуация. Читать подключение Java к базе данных MySQL
однако, поскольку этот плагин подключается нормально, означает, что соединение из контейнера Jenkins с контейнером MySQL в порядке.

подведем итог:
1. локальный тест с Maven прошел
2. Плагин Jenkins подключается к MySQL успех
3. Интеграционный тест не выполняется при запуске из Jenkins
4. локальная тестовая среда WIN10 64bit; Дженкинс работает в контейнере docker на Ubuntu 16.04 64bit server, с MySQL 5.7 контейнер подключается к той же сети моста.

Источник

Невозможно приобрести соединение JDBC при тестировании интеграции при использовании сети моста Docker

Когда я запускаю maven test локально передается. Но получил эту ошибку, когда я запустил ее на сервере CI.

При запуске локального теста все они передаются, используется настройка по умолчанию maven, предоставленная IntelliJ IDEA.
Поскольку ошибка связана с подключением к базе данных, поэтому я проверил Jenkins Audit to Database Plugin. Успешное соединение!

Unable to acquire jdbc connection что это. Смотреть фото Unable to acquire jdbc connection что это. Смотреть картинку Unable to acquire jdbc connection что это. Картинка про Unable to acquire jdbc connection что это. Фото Unable to acquire jdbc connection что это

Параметр подключения в моем application.properties также соответствует этому параметру

MySQL в URL-адресе – это имя контейнера док-станции MySQL. Если изменить его с помощью localhost или private IP в docker container inspect mysql докеров, docker container inspect mysql то сообщение об ошибке будет таким же, а Stacktrace немного отличается на последних двух строках.

для локального хоста

для частного IP-адреса

По-разному, я считаю, что хост в URL-адресе, localhost используется для локального теста. В то время как сервер Jenkins использовал сеть моста Докер.

Когда я запускаю тест JUnit в IntelliJ, он иногда не работает в локальной среде. Журнал ошибок выглядит так:

Я искал проблему, он сказал, что по умолчанию база данных использует верхний регистр базы данных. После запуска maven test эта проблема будет идти, если снова запустить тест JUnit в среде IDE. Но это не должно быть связано с основной причиной.

Найдите в сообщении об ошибке, найдите аналогичный вопрос, но с другим вложенным исключением:

Все они относятся к nested exception is javax.persistence.PersistenceException
Но nested exception is org.hibernate.exception.JDBCConnectionException: это моя ситуация. Чтение подключения Java к базе данных MySQL
однако, поскольку этот плагин подключается к OK, означает, что соединение с контейнером Jenkins в контейнере MySQL прекрасное.

Суммировать:
1. Местное тестирование с maven прошло
2. Плагин Jenkins подключается к успеху MySQL.
3. Тест интеграции не работает при запуске от Jenkins
4. локальная тестовая среда WIN10 64bit; Дженкинс работает в контейнере докеров на сервере Ubuntu 16.04 64 бит, а контейнер MySQL 5.7 подключается к одной и той же сети мостов.

вы должны привязать порт mysql контейнера докеров к порту в VM.

Это хорошо объяснено в нижнем потоке.

Благодаря @rohit-thomas. Мы сузим вопрос к тому, что связано с хостом URL-адреса.
Простым ответом является изменение хоста URL-адреса JDBC в весеннем загрузочном application.properties на IP-адрес хоста докера. От
spring.datasource.url=jdbc:mysql://mysql:3306/database?
в
spring.datasource.url=jdbc:mysql://172.17.0.1:3306/database?

Мой вывод:
Контейнер Jenkins, созданный из образа, способен связываться с контейнером MySQL с его именем контейнера или частным адресом в сети докеревого моста. Однако, поскольку приложение, созданное Jenkins, не может этого сделать. Поскольку контейнерный порт MySQL привязан к хост-машине, приложение может связываться с контейнером MySQL через порт хоста.

Если вывод неверен, комментарии приветствуются.

Некоторые вещи, которые вы можете проверить, могут помочь вам решить эту проблему.

В application.properties попытайтесь использовать IP-адрес хоста-докерера.

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

Проверьте, может ли серверное приложение достигнуть вашего mysql или наоборот. Зайдите внутрь контейнера докеров и попробуйте выполнить ping.

Источник

Hikari Unable to acquire JDBC Connection

We have Spring-boot/Hibernate/MYSQL application in our project and use Hikari as the connection pool. After a few minutes when our service is started we found the following problem:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

Caused by: org.springframework.dao.DataAccessResourceFailureException: Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

our config of datasource as follow:

any one here can give me some clue, Thank you!

1 Answer 1

You probably have transactions open that you never closed. As time goes by these transactions keep piling up and no new connections can be opened. The connection timeout hits and you get this unable to acquire JDBC connection.

You need to check all your transactional methods and make sure you close/commit them as soon as you are done

I would like to add a specific scenario where we had these issues. This involved a method annotated with @Transactional Database connections open within this method would be inside on open transaction until this method exits. The issue with our program was this was making few HTTP calls and the transactions would be open until the HTTP calls were done. As more calls to this service method were piling up more transactions were in open state than being closed.

Moral of the story: Open transactions, do your stuff quickly and then close the transaction; either implicitly by exiting methods marked @Transactional or by explicit call to transaction close.

Источник

[Solved] JDBCConnectionException: Unable to acquire JDBC Connection with Hibernate and MySQL

If you refresh or try to connect again, the application successfully connected to the database. And the problem keeps happening again if the user left the application for a quite long time and come back. Though this is not a serious problem in development, but it’s not good under the end-user’s perspective and they will see the application is buggy and their work is interrupted. So this problem should be solved completely.

So why is JDBCConnectionException thrown?

Therefore, when the Java database application has been idle longer than MySQL server’s connection timeout value, and the end user tries to connect again, Hibernate reuses the idle connection which was already dropped by the server, hence JDBCConnectionException is thrown.

Solutions to fix JDBCConnectionException

Let’s consider each suggestion mentioned above.

Increasing the server configured values for client timeouts:

Using the Connector/J connection property ‘autoReconnect=true’

If you look around on the web, you will see someone suggest adding the following properties to Hibernate configuration file:

I already tried this, and it doesn’t work.

A solution that really works to solve JDBCConnectionException problem:

If you project is Maven-based, add the following dependency to use c3p0:

If not, let find, download on Maven Central Repository add the following JAR files to your project’s classpath:

Then add the following properties to Hibernate/JPA configuration file of your project:

Let me explain these properties:

So that means you have to set the value of hibernate.c3p0.timeout less than the wait_timeout value on MySQL server. And the value 300 seconds in the above example is pretty good. This definitely solves the problem because the pool maintains no connections that are idle longer than the MySQL server’s timeout value.

And c3p0 can be used in production to replace Hibernate’s default internal pool.

Other Hibernate Tutorials:

About the Author:

Unable to acquire jdbc connection что это. Смотреть фото Unable to acquire jdbc connection что это. Смотреть картинку Unable to acquire jdbc connection что это. Картинка про Unable to acquire jdbc connection что это. Фото Unable to acquire jdbc connection что этоNam Ha Minh is certified Java programmer (SCJP and SCWCD). He started programming with Java in the time of Java 1.4 and has been falling in love with Java since then. Make friend with him on Facebook and watch his Java videos you YouTube.

Источник

Устранение неполадок с подключением

Скачать драйвер JDBC

Microsoft JDBC Driver для SQL Server для обмена данными с базой данных SQL Server необходим установленный протокол TCP/IP. Просмотреть установленные протоколы сетевой библиотеки можно с помощью диспетчера конфигурации SQL Server.

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

Протокол TCP/IP не включен для SQL Server, либо указан неправильный сервер или номер порта. Убедитесь, что SQL Server с включенным протоколом TCP/IP прослушивает заданный порт на указанном сервере. При этом может быть вызвано исключение примерно такого содержания: «Не удалось войти в систему. Не удалось соединиться с узлом по протоколу TCP/IP». Это указывает на одну из следующих причин:

SQL Server установлен, но сетевой протокол TCP/IP не установлен для SQL Server с помощью программы SQL Server Network Utility для SQL Server 2000 (8.x) или диспетчера конфигурации SQL Server для SQL Server 2005 (9.x) и более поздних версий.

TCP/IP установлен в качестве протокола SQL Server, но не прослушивается порт, указанный в URL-адресе для подключения к JDBC. Порт 1433 задан по умолчанию, но при установке SQL Server можно настроить прослушивание любого порта. Убедитесь, что SQL Server прослушивает порт 1433. Кроме того, если порт был изменен, убедитесь, что порт, указанный в URL-адресе для соединения с JDBC, совпадает с измененным портом. Дополнительные сведения о формировании URL-адресов для соединения с JDBC см. в этой статье.

Адрес компьютера, указанный в URL-адресе для подключения к JDBC, не содержит ссылки на сервер, где установлен и запущен SQL Server.

Используемый сервером порт закрыт брандмауэром. Это может быть порт, используемый сервером, или (необязательно) порт, связанный с именованным экземпляром сервера.

Указано неверное имя базы данных. Убедитесь, что такая база данных SQL Server действительно существует.

Неправильное имя пользователя или пароль. Проверьте вводимые данные.

При использовании проверки подлинности SQL Server JDBC Driver требует, чтобы на SQL Server была установлена проверка подлинности SQL Server, отличная от проверки по умолчанию. Убедитесь, что этот параметр включен при установке или настройке вашего экземпляра SQL Server.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *