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

Connect to Cloud SQL using Sql2o in Google Cloud Endpoint

我正在尝试连接到 google 云端点内的云 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

我该如何解决这个问题?

编辑:

更改为 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 Engine,并尝试 return 一个有意义的值。它起作用了,一个简单的 'hellp world' 字符串将被 returned.

接下来,我尝试使用 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");

所有这些之后,我仍然收到此错误消息。

    503 Service Unavailable

- Show headers -

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

当在类路径中找不到 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); }