2016-06-22 2 views
2

Я несколько дней борется с проблемой в Google App Engine, используя Java.NullPointerException с JDBC и движком App

Много раз (около 50% времени), когда я пытаюсь запросить подключение к экземпляру Cloud Sql, соединение возвращает нулевое значение, в результате чего возникает несколько сообщений NullPointerException при попытке вызвать запросы Cloud Sql (при вызове. prepareCall (stored_proc)).

У меня есть последняя версия Java SDK для приложений App Engine, предоставляемая совместно с другими службами, встроенными в Python, которые потребляют этот Java-сервер.

Возможно ли, что через определенное время экземпляр/s может потерпеть крах (я просто тестирую на этом этапе, поэтому я использую масштабирование по умолчанию)?

Это код, который возвращает нуль:

 Class.forName("com.mysql.jdbc.GoogleDriver"); 
     url = "jdbc:google:mysql://project:instance/database?user=root"; 
     log.info(url); 
     return DriverManager.getConnection(url); 

Это часть моего файла конфигурации:

<application>app</application> 
<module>mod</module> 
<version>1</version> 
<threadsafe>true</threadsafe> 

<use-google-connector-j>true</use-google-connector-j> 

Я попробовал несколько предложений от других постов, но не имели успеха на всех.

Любое предложение будет приветствоваться, спасибо заранее.

ответ

0

Я добавлю это в качестве ответа, поскольку это не совсем то, что упоминал Криспинус, хотя он дал мне хорошую идею для решения.

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

Итак, хотя это кажется очевидным, проверьте, что соединения закрыты (или управляются, как говорит Криспинус).

1

Я столкнулся с такой же проблемой при использовании Google Cloud SQL и приложения.

Я решил проблему, управляя пулом соединений. Я понял, что когда вы запрашиваете новое соединение для каждого запроса и закрываете его по завершении потока. Другие запросы вернут нулевое значение, что приведет к исключению NullPointException.

Я решил сделать следующее, и это работает для меня как 2 года.

  • Открыть соединение и сохранить его в статическом классе, имеющем несколько соединений;
  • Каждый раз, когда я хочу найти соединение с базой данных, я сначала проверю, есть ли доступное соединение для меня.
  • Incase a Query убил соединение, поэтому мне нужно было запросить дополнительное дополнительное соединение только для того, чтобы мешок соединения упал.
+0

Большое спасибо за ваш ответ, Криспинус, я могу, конечно, попробовать это и посмотреть, что произойдет, сообщит вам об этом. Еще один вопрос: есть ли у вас лимит подключения в вашем приложении? Как вы с этим справились? App Engine допускает максимальное количество 12 одновременных подключений на один экземпляр, если я хорошо помню. –