【问题标题】:Why is the Google App Engine JDBC connection URL not working?为什么 Google App Engine JDBC 连接 URL 不起作用?
【发布时间】:2019-03-06 20:10:03
【问题描述】:

我正在开发一个带有注册页面的网站。我想将用户详细信息存储在 Google App Engine 上的 MySQL 数据库表中。以下是 JDBC 连接 URL:-

Connection  con = DriverManager.getConnection("jdbc:mysql://google/my_database_name?cloudSqlInstance=my_db_instance&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=My_Username&password=My_Password&useSSL=false", "root", "My_Password");

但是即使在注册后,此 URL 也无法正常工作,我的数据库表中没有存储任何详细信息。因此,请提出任何替代方案。谢谢

以下是从 Register.jsp 获取输入值的 RegistrationServlet 代码,我希望它将值存储到我的 gcloud db 表中:-

  @WebServlet("/RegistrationServlet")
public class RegistrationServlet extends HttpServlet {
 private static final long serialVersionUID = 1 L;

 public RegistrationServlet() {
  super();

 }

 @Override
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {

 }

 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {

  PrintWriter out = response.getWriter();

  String first_name = request.getParameter("f1");
  String last_name = request.getParameter("l1");
  String phone = request.getParameter("p1");
  String email = request.getParameter("e1");
  String uname = request.getParameter("uname");
  String user_dob = request.getParameter("udate");
  String password = request.getParameter("pwd");



  UserData ud = new UserData();

  ud.setFirst_name(first_name);
  ud.setLast_name(last_name);
  ud.setUname(uname);
  ud.setPhone(phone);
  ud.setEmail(email);
  ud.setUser_dob(user_dob);
  ud.setPassword(password);

  // validate given input
  if (first_name.isEmpty() || last_name.isEmpty() || phone.isEmpty() || email.isEmpty() || password.isEmpty()) {
   RequestDispatcher rd = request.getRequestDispatcher("Register.jsp");
   out.println("<font color=red>Please fill all the fields</font>");
   rd.include(request, response);
  } else {
   try {
    Class.forName("com.mysql.jdbc.Driver");
   } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   // loads mysql driver



   try {
    Connection con = DriverManager.getConnection("jdbc:mysql://google/my_database_name?cloudSqlInstance=my_db_instance&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=My_Username&password=My_Password&useSSL=false", "root", "My_Password");


    String query = "insert into users values(?,?,?,?,?,?,?)";

    PreparedStatement ps = con.prepareStatement(query); //generates sql query



    ps.setString(1, first_name);


    ps.setString(2, last_name);


    ps.setString(3, uname);


    ps.setString(4, phone);


    ps.setString(5, email);


    ps.setString(6, user_dob);


    ps.setString(7, password);



    ps.executeUpdate();

    System.out.println("successfully inserted");



    ps.close();




    con.close();




   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   HttpSession session = request.getSession();
   session.setAttribute("username", first_name);
   response.sendRedirect("Success.jsp");



  }
 }

【问题讨论】:

  • 在 URL 中,属性 cloudSqlInstance 具有 my_db_instance 作为值。您能否确认该值为instance_connection_name(例如:&lt;MY-PROJECT&gt;:&lt;INSTANCE-REGION&gt;:&lt;INSTANCE-NAME&gt;)?另外,您遵循什么示例来建立连接?你是在本地测试吗?我建议按照GCP CloudSQL for MySQL 连接示例使用一个简单的应用程序来测试连接是否有效
  • 这里我没有提到我的确切数据库实例。 my_db_instance 仅供您参考。是的,我在本地对其进行了测试,并且在那里运行良好。我正在关注官方的 Google Cloud 文档。谢谢,但我正在关注您提到的同一来源的文档。

标签: java mysql jsp google-app-engine servlets


【解决方案1】:

我已经关注了GCP CloudSQL for MySQL connection example,并且在部署后它已经工作了。我将一步一步地进行我所做的过程,以便您可以比较并查看您是否缺少某些配置步骤。

  1. 使用了 MySQL 第二代 Cloud SQL 实例。此实例与我将在其中部署脚本的 Google App Engine 位于同一项目

  2. 在 CloudSQL 实例中创建了一个新数据库

  3. 运行命令gcloud sql instances describe instance1获取&lt;MY-PROJECT&gt;:&lt;REGION&gt;:&lt;INSTANCE-NAME&gt;形式的实例连接名称

  4. 下载了 GCP Java 代码示例并获得了 Java 8 App Engine 标准 Cloud SQL 示例:

    git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
    cd java-docs-samples/appengine-java8/cloudsql/

  5. 使用我的案例的连接值完成了 POM 文件中的字段 &lt;INSTANCE_CONNECTION_NAME&gt;&lt;user&gt;&lt;password&gt;&lt;database&gt;appengine-web.xml 将使用该字段来创建 cloudsql 属性,该属性将被 CloudSqlServlet.java 中的代码用作 连接 URL

  6. 同样在appengine-web.xml 中,我将&lt;service&gt; 名称更改为default。这个文件实际上不需要更改任何内容,但由于个人喜好,我选择更改服务

  7. other required dependencies 已在下载的POM

  8. 使用 mvn appengine:deploy 部署到 GAE

这是一个用于 MySQL 的 GAE 到 Cloud SQL 连接的最小示例。尝试按照以下步骤测试连接是否与提供的代码示例正常工作。

【讨论】:

  • 您好,感谢您的回答,但我认为,主要问题在于我上面提到的 URL。使用 mysql 在 gcloud 上成功完成了数据库设置,因为我还从终端访问了数据库。我有一个 RegistrationServlet,它从 Register.jsp 页面获取输入并将它们存储到 gcloud db 中。我已经编辑了上面的问题,并在那里粘贴了 RegistrationServlet 代码。请看看。
  • @ShashankkShekarChaturvedi 我在我的示例中使用了您的代码,它在本地和部署后插入到数据库中。您能否更深入地了解为什么您认为问题出在 URL 中。此外,您说数据存储中没有存储任何信息。日志或其他地方没有错误跟踪?
  • 嗨,现在我认为问题不在于 URL。我的项目不是基于 maven 的,但现在我已将其配置为 maven 项目。它在本地工作,但是当我使用“clean appengine:deploy”部署它时,它给了我一个错误,指出在当前项目和插件组中没有找到前缀“appengine”的插件。但是,我已经这样设置了:- com.google.appengineappengine-maven-plugin1.9.66 在我的 pom.xml 文件中。请帮忙。谢谢
  • 你能帮我解决这个问题吗:- stackoverflow.com/questions/52707416/…
猜你喜欢
  • 2019-09-06
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
相关资源
最近更新 更多