在 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);
}
我正在尝试连接到 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);
}