使用Google Cloud Endpoint中的Sql2o连接到Cloud SQL

时间:2015-01-14 10:54:32

标签: google-app-engine google-cloud-endpoints google-cloud-sql

我正在尝试连接到google cloud端点内的云sql,并使用轻量级jdbc包装器sql2o作为数据访问方法。

@Api(name = "questionapi", version = "v1", description = "question api")
public class QuestionService {

    private static Sql2o sql2o = new Sql2o(
            "jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxxxx", "root",
            "xxxxxxx");

    @ApiMethod(name = "get", httpMethod = HttpMethod.GET)
    public List<Question> get() {

        String q = "select * from questions";

        try (Connection conn = sql2o.open()) {
            return conn.createQuery(q).executeAndFetch(Question.class);
        }
    }

应用程序运行后,我可以访问localhost:8888/_ah/api/explorer来尝试api。但是,有一个错误说:

org.sql2o.Sql2oException: Could not acquire a connection from DataSource - No suitable driver found for jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxxxx

我该如何解决这个问题?

修改

enter image description here

更改为maven项目后,我收到了这条新的错误消息:

503 Service Unavailable

- Show headers -

{
 "error": {
  "message": "java.lang.NoClassDefFoundError: Could not initialize class com.mysql.jdbc.ConnectionImpl",
  "code": 503,
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "java.lang.NoClassDefFoundError: Could not initialize class com.mysql.jdbc.ConnectionImpl"
   }
  ]
 }
}

修改

这是新的一天,我仍然坚持到这里。

我所做的是使用maven下载 endpoints-skeleton-archetype 项目,它是一个新的,空的Cloud Endpoints后端API项目,可以使用,包含所需的文件和目录。

我立即将其部署到app引擎,并尝试返回有意义的值。它有效,将返回一个简单的'hellp world'字符串。

接下来,我尝试使用jdbc连接到云sql。为了做到这一点,我按照教程here进行了操作 将<use-google-connector-j>true</use-google-connector-j>添加到 appengine-web.xml

我尝试不同的连接字符串组合

    Class.forName("com.mysql.jdbc.GoogleDriver");
        String url = "jdbc:google:mysql://xxxxxxxxxxxx:xxxxx?user=root";

        conn = DriverManager.getConnection(url);
        ResultSet rs = conn.createStatement().executeQuery("SELECT 1 + 1");

enter image description here

毕竟,我仍然收到此错误消息。

    503 Service Unavailable

- Show headers -

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "backendError",
    "message": "java.lang.NullPointerException"
   }
  ],
  "code": 503,
  "message": "java.lang.NullPointerException"
 }
}

1 个答案:

答案 0 :(得分:1)

在类路径中找不到jdbc驱动程序时会发生此错误。你是如何管理依赖关系的?你用maven吗?如果将mysql jdbc驱动程序添加到依赖项列表中,则应该修复错误。

我对您的代码有另一条评论,这与您的问题无关。但无论如何它来了。 下面的代码行有一个连接泄漏,因为你永远不会关闭连接。这最终将耗尽连接池,您的应用程序将挂起。 return sql2o.open().createQuery(q).executeAndFetch(Question.class);

这是使用sql2o时正确的方法: try (Connection con = sql2o.open()) { return con.createQuery(q).executeAndFetch(Question.class); }