使用JDBC和App Engine

时间:2016-06-22 01:43:04

标签: google-app-engine

我一直在努力解决使用Java的Google App Engine中的问题几天。

当我尝试请求连接到Cloud Sql实例时,很多次(大约50%的时间),连接返回一个空值,在尝试调用Cloud Sql查询时产生几个NullPointerException消息(调用.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>

我尝试了其他帖子的几条建议,但都没有成功。

任何建议都会受到欢迎,谢谢。

2 个答案:

答案 0 :(得分:1)

使用Google Cloud SQL和App引擎时,我遇到了同样的问题。

我通过自己管理连接池解决了这个问题。我意识到当您为每个请求请求新连接并在完成线程时关闭它。其他请求将返回null,导致NullPointException。

我决定做以下事情,这对我来说已经有2年了。

  • 打开连接并将其保存到具有多个连接的静态类;
  • 每当我想找到与数据库的连接时,我首先会检查是否有可供我使用的连接。
  • Incase a Query杀死了连接,因此意味着我需要另外一个额外的连接才能解决连接丢失问题。

答案 1 :(得分:0)

我会将此作为答案添加,因为它不完全是Chrispinus所提到的,尽管他给了我一个很好的解决方案。

我深入研究了代码,发现有些方法没有关闭数据库连接。我以为所有人都这样做,但看着每种方法,我发现我错了。

所以,虽然听起来很明显,但检查连接正在关闭(或管理,如Chrispinus所说)。