2016-06-22 60 views
2

我一直在使用Java在Google App Engine中遇到問題幾天。使用JDBC和App Engine引發NullPointerException

當我嘗試請求與Cloud Sql實例的連接時,連接返回空值,導致在嘗試調用Cloud Sql查詢時(調用時)出現多個NullPointerException消息,很多次(大約50%的時間)。的prepareCall(stored_proc))。

我有一個最新的App Engine Java SDK,在項目服務中,與使用Python構建的其他服務共享,這些服務使用此Java後端。

是否有可能在一定的時間後實例可能會崩潰(我現在只是測試,所以我使用默認的scalation)?

這是返回null代碼:

 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

我會加上這個答案,因爲它不完全是Chrispinus提到的,儘管他給了我一個好的解決方案。

我深入瞭解代碼,發現一些方法沒有關閉數據庫連接。我假設他們都是這樣做的,但是看着每種方法,我發現我錯了。

因此,雖然聽起來很明顯,但檢查連接是否正確關閉(或管理,正如Chrispinus所說)。

1

我在使用Google Cloud SQL和App引擎時遇到同樣的問題。

我通過管理連接池我自己解決了這個問題。我意識到,當你爲每個請求請求一個新的連接並在線程完成時關閉它。其他請求會返回NullPointException的空值。

我決定做以下工作,現在爲我工作了2年。

  • 打開一個連接並將其保持到一個具有多個連接的靜態類;
  • 每次我想找到一個到數據庫的連接時,我都會先檢查是否有可用的連接。
  • Incase a Query終止連接,因此意味着我需要另一個額外的連接來處理連接丟失。
+0

非常感謝您的回答,Chrispinus,我當然可以嘗試一下,看看會發生什麼,會讓你知道。還有一個問題:你的應用有連接限制嗎?你是怎麼處理的?如果我記得的話,App Engine允許每個實例最多有12個併發連接。 –