2014-01-03 1 views
9

Я создал веб-сервлет Java, используя механизм приложения, сервлет делает запросы к базе данных. Я тестировал сервлет локально, используя локальную базу данных, и он отлично работал, после чего я начал тестировать сервлет локально, но я получил доступ к базе данных Cloud SQL, это также отлично работало.App Engine Java Servlet не подключается к Cloud SQL

Моя проблема возникает после развертывания сервлета. После развертывания все запросы базы данных возвращают следующие:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not 
received any packets from the server. 

Я проверил в консоли облака, и мое приложение было правильно добавлен в облаке SQL Авторизованный приложений App Engine на вкладке Access Control.

У кого-нибудь были проблемы с развернутыми сервлетами для серфинга приложений? Какие-либо решения или рекомендации там? Буду признателен за любую помощь!

ОБНОВЛЕНИЕ:

выше ошибка генерируется, используя следующий код, чтобы получить доступ к БД

Class.forName("com.mysql.jdbc.Driver"); 
Url = "jdbc:mysql://<ip-address-cloudsql>:3306/<dbname>"; 
Connection con = DriverManager.getConnection (Url,"root",<password>); 

была дружнее та же ошибка При использовании этого кода, обратите внимание, что он очень похож на код показано на примере здесь https://developers.google.com/appengine/docs/java/cloud-sql/

Class.forName("com.mysql.jdbc.GoogleDriver"); 
Url = "jdbc:google:mysql://<appID:instanceID>/<dbname>? 
user=root&password=<password>"; 
Connection con = DriverManager.getConnection (Url); 

Я последовал за советы форматирования показать в го это StackOverflow поста, когда дело дошло до установки URL, используя APPID и идентификатор экземпляра: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:

Используя этот код приводит к следующей различной ошибке:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) 

Я предполагаю, что это говорит, потому что мои локальные базы данные cloudsql установлен для выполнения сервлета механизма приложения. Кроме того, знайте, что оба эти метода отлично работали при запуске сервлета локально и доступе к базе данных облака sql.

любые мысли? Я не знаю, что еще попробовать: [

+0

Вы изменили пароль для корневой @ lokalny_host? По умолчанию для root @ localhost нет пароля. Запрос, который поможет увидеть состояние пользователя/паролей, это «SELECT user, host, password FROM mysql.user'. –

+0

Я думал, что изменил его в облачной консоли. но при запуске этого запроса пароль был установлен только для% user, localhost был пустым. смена пароля на пустой была успешной спасибо! однако я хотел бы добавить пароль для localhost, как я могу это сделать? –

+0

Вы должны установить корень @ localst пароль, используя такой запрос: 'UPDATE mysql.user SET password = PASSWORD ('XXXX') WHERE user = 'root' AND host = 'localhost'' где' XXXX' является пароль, который вы хотите. –

ответ

18

При подключении к Cloud SQL из авторизованного приложения App Engine пароль не требуется (на самом деле он не удастся при попытке установить соединение с паролем).

Изменить подключение строки jdbc:google:mysql://<appID:instanceID>/<dbname>? user=root опуская &password=<password> части

+4

Вау, это спасло меня. Сообщение об ошибке при попытке использовать пароль не совсем полезно. –

+3

Да, он потратил много времени на то, чтобы понять, почему он не работает. Не действительно полезное сообщение – momo

+6

Wow, +1. Я не могу поверить, что нигде не было зарегистрировано ... –

3

Если вы Авторизованные приложения App Engine вы App Engine о настройках управления доступом вам не нужен пароль, так как он является локальным, так просто сделать вам пароль = " «; Однако, если вы используете что-то удаленное, например phpmyadmin, которое запускается с другого хоста, вашей командной строки или виртуальной машины GCE, которая проходит через TCP, SSH или HTML, вам потребуется пароль = «что-то»; где что-то задано вами в вашем контроле доступа.

0

Кому-нибудь из Google, который смотрит, почему вы, возможно, получаете «com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Ошибка связи» в соединении.

Убедитесь, что ваш IP-адрес разрешен, если вы звоните с тестового сервера.

Я тестировал в доме друзей, и эта бесполезная ошибка продолжала появляться.

0

При подключении к Google Cloud Sql вы должны быть осторожны: -Для закрытия открытых подключений -При использовании алгоритма экспоненциального отклика при попытке создать новое соединение. Для получения дополнительной информации см: https://cloud.google.com/sql/faq

0

Если вы используете application.properties в Spring загрузки приложения, а затем просто поместите строку ниже в application.properties:

spring.datasource.url: jdbc:mysql://google/<dbname>?cloudSqlInstance=<InstanceName>&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=****&password=**** 
+0

Это для локального сервера mysql, не для приложения в облачном приложении Engine. – Ishaan