Google端点有什么问题 - 云端SQL连接?

时间:2015-09-22 15:26:07

标签: mysql sql-server maven jdbc google-cloud-endpoints

我正在尝试从Google端点服务器连接到Google Cloud SQL服务器。我正在修改本教程中的Greetings.getGreeting()方法: https://cloud.google.com/appengine/docs/java/endpoints/getstarted/backend/helloendpoints 调用Cloud mysql数据库,如本教程中所示(请参阅doGet方法): https://cloud.google.com/appengine/docs/java/cloud-sql/#enable_connector_j

我确保可以从我的机器mysql客户端连接到数据库。数据库实例“simple”具有单个表“simpletable”,其中的行包含entityID和字符串。 (但我无法连接,所以这还不太重要。)

这是我的端点代码:

package com.example.helloendpoints;

import com.google.api.server.spi.config.Api;
import com.google.api.server.spi.config.ApiMethod;
import com.google.api.server.spi.response.NotFoundException;
import com.google.appengine.api.users.User;

import java.sql.*;
import java.util.ArrayList;

import javax.inject.Named;

/**
 * Defines v1 of a helloworld API, which provides simple "greeting" methods.
 */
@Api(
    name = "helloworld",
    version = "v1",
    scopes = {Constants.EMAIL_SCOPE},
    clientIds = {Constants.WEB_CLIENT_ID,
            Constants.ANDROID_CLIENT_ID,
            Constants.IOS_CLIENT_ID,
            Constants.API_EXPLORER_CLIENT_ID},
    audiences = {Constants.ANDROID_AUDIENCE}
)
public class Greetings {

  public static ArrayList<HelloGreeting> greetings = new ArrayList<HelloGreeting>();

  static {
    greetings.add(new HelloGreeting("hello world!"));
    greetings.add(new HelloGreeting("goodbye world!"));
  }

  public HelloGreeting getGreeting(@Named("id") Integer id) throws NotFoundException {

      // pair to use when running local endpoint server
      String urlFromDev = "jdbc:mysql://173.194.XXX.90:3306/simple?user=root";
      String classForNameFromDev = "com.mysql.jdbc.Driver";

      // pair to use when running cloud endpoint server
      String classForNameFromCloud = "com.mysql.jdbc.GoogleDriver";
      String urlFromCloud = "jdbc:google:mysql://"
              + Constants.PROJECT_ID + ":"
              + Constants.CLOUD_SQL_INSTANCE_NAME +"/"
              + Constants.DATABASE_NAME + "?user=root";

      HelloGreeting helloGreeting = new HelloGreeting();
      try {
              Class.forName(classForNameFromDev);
//              Class.forName(classForNameFromCloud);
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
      }
      try {
          Connection connection = DriverManager.getConnection(urlFromDev);
//          Connection connection = DriverManager.getConnection(urlFromCloud);
          try {
              String statement = "Select simplestring from simpletable where entryID = ?";
              PreparedStatement preparedStatement = connection.prepareStatement(statement);
              preparedStatement.setInt(1, id);
              ResultSet resultSet = preparedStatement.executeQuery();
              if (!resultSet.wasNull()) {
                  helloGreeting.setMessage(resultSet.getString("simplestring"));
              } else {
                  throw new NotFoundException("Greeting not found with an index: " + id);
              }
          } finally {
              connection.close();
          }
      } catch (SQLException e) {
          e.printStackTrace();
      }
      return  helloGreeting;
  }


  @ApiMethod(name = "greetings.multiply", httpMethod = "post")
  public HelloGreeting insertGreeting(@Named("times") Integer times, HelloGreeting greeting) {
    HelloGreeting response = new HelloGreeting();
    StringBuilder responseBuilder = new StringBuilder();
    for (int i = 0; i < times; i++) {
      responseBuilder.append(greeting.getMessage());
    }
    response.setMessage(responseBuilder.toString());
    return response;
  }

  @ApiMethod(name = "greetings.authed", path = "hellogreeting/authed")
  public HelloGreeting authedGreeting(User user) {
    HelloGreeting response = new HelloGreeting("hello " + user.getEmail());
    return response;
  }
}

我尝试在appengine-web.xml中启用mysql connector / j

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <use-google-connector-j>true</use-google-connector-j>

    <application>backendapitutorial-1XXX</application>
    <version>${app.version}</version>
    <threadsafe>true</threadsafe>

    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-  INF/logging.properties"/>
    </system-properties>
</appengine-web-app>

无论我构建哪种方式+开发它(开发还是云),我总能得到     java.sql.SQLException:没有为jdbc找到合适的驱动程序:mysql://173.194.XXX.90:3306 / simple?user = root 要么      java.sql.SQLException:没有为jdbc找到合适的驱动程序:google:mysql:// backendapitutorial-XXXX:simple / simple?user = root

(我用这个帖子用“X”替换了真实的IP和项目名称。)

我已经看过这些了:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/dbname

ClassNotFoundException: com.mysql.jdbc.GoogleDriver

What does 'Class.forName("org.sqlite.JDBC");' do?

我正在使用Maven构建并使用IntelliJ IDE。

非常感谢任何帮助。感谢。

0 个答案:

没有答案