为什么Google App Engine JDBC连接URL不起作用?

时间:2018-10-01 17:12:00

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

我正在开发带有注册页面的网站。我想将用户详细信息存储在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无效,因为即使注册后也没有,我的数据库表中没有存储任何详细信息。因此,请提出其他建议。谢谢

以下是RegistrationServlet代码,该代码从Register.jsp获取输入值,我希望它将值存储到我的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");



  }
 }

1 个答案:

答案 0 :(得分:1)

我遵循了GCP CloudSQL for MySQL connection example,并且在部署后一直有效。我将逐步完成我所做的过程,以便您可以进行比较,看看最后是否缺少一些配置步骤。

  1. 使用了MySQL第二代Cloud SQL实例。该实例与我将在其中部署脚本的Google App Engine 相同项目
  2. 在CloudSQL实例中创建一个新数据库
  3. 运行命令gcloud sql instances describe instance1<MY-PROJECT>:<REGION>:<INSTANCE-NAME>
  4. 的形式获取实例连接名称
  5. 下载了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/

  6. 使用我的案例的连接值完成了<INSTANCE_CONNECTION_NAME>文件中的字段<user><password><database>POMappengine-web.xml将使用此字段来创建cloudsql属性,该属性将被CloudSqlServlet.java

    <中的代码用作连接URL / li>
  7. 我还在appengine-web.xml中将<service>的名称更改为default。实际上不需要更改此文件上的任何内容,但由于个人喜好,我选择更改服务

  8. 已下载的POM中已经存在的other required dependencies
  9. 通过mvn appengine:deploy部署到GAE

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