我正在尝试连接到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
我该如何解决这个问题?
修改
更改为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");
毕竟,我仍然收到此错误消息。
503 Service Unavailable
- Show headers -
{
"error": {
"errors": [
{
"domain": "global",
"reason": "backendError",
"message": "java.lang.NullPointerException"
}
],
"code": 503,
"message": "java.lang.NullPointerException"
}
}
答案 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);
}