首页 文章

在Eclipse中进行开发时,无法从Google App Engine连接到Google Cloud SQL实例

提问于
浏览
1

EDIT: This has been resolved by checking the log file on the Google Developers Console. The error was not in connecting to the database, but was because I was compiling with JDK 1.8 instead of 1.7. It turned out that even though I had told Eclipse to use JDK 1.7 for the project, it was still using 1.8 because I had the following line in my Eclipse configuration file:

-vm
C:\Program Files\Java\jdk1.8.0_20\bin

when I changed this to:

-vm
C:\Program Files\Java\jdk1.7.0_71\bin

everything worked perfectly.

原始问题:

我正在尝试从我的授权Google App Engine应用程序连接到Google Cloud SQL实例 . 我开始按照https://cloud.google.com/appengine/docs/java/cloud-sql/#Java_Build_a_starter_application_and_database上的说明进行操作并略微修改它们以使用我的Cloud SQL实例(我没有实现留言簿数据库,我使用了我自己的,也只有一个包含三列的表) . 我使用MySQL Workbench创建了Cloud SQL实例 .

当我调试我的应用程序 locally (在localhost:8888上运行)时,它与我的本地MySQL实例完美配合 AND the Google Cloud SQL instance. 但是,当我尝试将我的应用程序部署到Google App Engine时,它只会吐出500服务器错误,我不知道是什么出错了(我对网络编程很新) . 我一直在网上搜索这个问题的解决方案,但我还没有找到可以解决问题的方法 .

这是我的servlet代码:

package com.rmpm;

import java.io.*;
import java.sql.*;
import javax.servlet.http.*;
import com.google.appengine.api.utils.SystemProperty;


@SuppressWarnings("serial")
public class Synaptic_rmpmServlet extends HttpServlet {
    @Override
      public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String url = null;
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();

        try {
          if (SystemProperty.environment.value() ==
              SystemProperty.Environment.Value.Production) {
            // Load the class that provides the new "jdbc:google:mysql://" prefix.
            Class.forName("com.mysql.jdbc.GoogleDriver");
            url = "jdbc:google:mysql://<my-project-id>:<my-instance-id>/test"; // Doesn't work
          } else {
            // Local MySQL instance to use during development.
            Class.forName("com.mysql.jdbc.Driver");
            url = "jdbc:mysql://173.###.##.###:3306/test"; // Connects to Google Cloud SQL instance when root password is provided
            //url = "jdbc:mysql://127.0.0.1:3306/test";    // Connects to local MySQL instance
          }
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

        try {
          Connection conn = DriverManager.getConnection(url, "root", "");
          try {
            String pid = req.getParameter("projID");
            String own = req.getParameter("owner");
            String dur = req.getParameter("duration");
            if (pid == "" || own == "" || dur == "") {
              out.println(
                  "<html><head></head><body>You are missing either a projectID, owner name, or duration! Try again! " +
                  "Redirecting in 3 seconds...</body></html>");
            } 
            else {
                int duration = Integer.parseInt(dur);
                String statement = "INSERT INTO project VALUES(?, ?, ?)";
                PreparedStatement stmt = conn.prepareStatement(statement);
                stmt.setString(1, pid);
                stmt.setString(2, own);
                stmt.setInt(3, duration);
                int success = 2;
                success = stmt.executeUpdate();
                if (success == 1) {
                    out.println(
                            "<html><head></head><body>Success! Redirecting in 3 seconds...</body></html>");
                } else if (success == 0) {
                    out.println(
                            "<html><head></head><body>Failure! Please try again! " +
                            "Redirecting in 3 seconds...</body></html>");
                }
            }
          } finally {
           conn.close();
          }
        } 
        catch (SQLException e) {
            e.printStackTrace();
        }
        resp.setHeader("Refresh", "3; url=/databaseIO.jsp");
      }
}

我的databaseIO.jsp代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List" %>
<%@ page import="java.sql.*" %>
<%@ page import="com.google.appengine.api.utils.SystemProperty" %>

<html>
  <body>

<%
String url = null;
if (SystemProperty.environment.value() ==
SystemProperty.Environment.Value.Production) {
  // Load the class that provides the new "jdbc:google:mysql://" prefix.
  Class.forName("com.mysql.jdbc.GoogleDriver");
  url = "jdbc:google:mysql://<my-project-id>:<my-instance-id>/test";   // Doesn't work
} else {
  // Local MySQL instance to use during development.
  Class.forName("com.mysql.jdbc.Driver");
  url = "jdbc:mysql://173.###.##.###:3306/test";       // Connects to Google Cloud SQL instance when root password is provided
  //url = "jdbc:mysql://127.0.0.1:3306/test";          // Connects to local MySQL instance
}

Connection conn = DriverManager.getConnection(url, "root", "");
ResultSet rs = conn.createStatement().executeQuery(
    "SELECT * FROM project");
%>

<table style="border: 1px solid black">
<tbody>
<tr>
<th width="40%" style="background-color: #CCFFCC; margin: 5px">projectID</th>
<th style="background-color: #CCFFCC; margin: 5px">owner</th>
<th style="background-color: #CCFFCC; margin: 5px">duration</th>
</tr>

<%
while (rs.next()) {
    String aPID = rs.getString(1);
    String anOwner = rs.getString(2);
    int aDur = rs.getInt(3);
 %>
<tr>
<td><%= aPID %></td>
<td><%= anOwner %></td>
<td><%= aDur %></td>
</tr>
<%
}
conn.close();
%>

</tbody>
</table>

No more projects! <p><strong>Add a project:</strong></p> <form action="/sign" method="post"> <div>Project ID: <input type="text" name="projID"></input></div>
<div>Owner: <input type="text" name="owner"></input></div>
<div>Duration: <input type="text" name="duration"></input></div>
<div><input type="submit" value="Insert Project"></input></div> </form> </body> </html>

基于我在 authorized Google App Engine应用程序中以root用户身份连接到我的Google Cloud SQL实例时需要密码的内容 . 当我在调试模式下本地连接到Google Cloud SQL实例时,我确实提供了我在Google Developers Console中设置的root密码,它完美无缺 .

我做了什么:

  • 我已使用链接到我的Google App Engine应用程序的Google帐户登录Eclipse .

  • 我已经在appengine-web.xml文件中包含了 <use-google-connector-j>true</use-google-connector-j> 行 .

  • 我已将mysql-connector-java-5.1.33-bin.jar复制到项目的war / WEB-INF / lib文件夹以及D:\ Program_Files \ Eclipse \ plugins \ com.google.appengine中的GAE SDK目录.eclipse.sdkbundle_1.9.13 \ appengine-java-sdk-1.9.13 \ lib \ impl(在线阅读类似问题说要做到这一点) .

  • 我已授权我的Google App Engine应用程序连接到我的Google Cloud SQL实例 .

  • 我已授权我的本地网络连接到我的Google Cloud SQL实例 .

  • 我100%确定JDBC网址中的 <my-project-id><my-instance-id> 字段是正确的 .

  • I 've tried using my Google Cloud SQL instance'在JDBC URL中的IP地址,而不是project-id和instance-id .

我在用什么:

009 Eclipse SE Luna(4.4.1),带有Google Plugin for Eclipse(4.4)和Google App Engine Java SDK(1.9.13) . 我使用插件从Eclipse直接部署到Google App Engine .

  • JDK 1.7

  • Windows 8.1 64位

如果您需要任何其他信息,请在此处发布,因为我会定期查看此信息 .

1 回答

  • 0

    本地mysql将处理你的代码,我有同样的问题,但我改变.GoogleDriver到.Driver它开始工作

相关问题