我正在开发一个带有注册页面的网站。我想将用户详细信息存储在 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 数据库表中:-
@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");
}
}
最佳答案
我关注了 GCP CloudSQL for MySQL connection example它在部署后有效。我将逐步执行我执行的过程,这样您就可以进行比较,看看您是否遗漏了一些配置步骤。
使用了 MySQL 第二代 Cloud SQL 实例。此实例与我将在其中部署脚本的 Google App Engine 位于同一项目
在 CloudSQL 实例中创建了一个新数据库
运行命令
gcloud sql instances describe instance1
以<MY-PROJECT>:<REGION>:<INSTANCE-NAME>
的形式获取实例连接名称下载 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/
完成字段
<INSTANCE_CONNECTION_NAME>
,<user>
,<password>
和<database>
来自POM
包含我的案例的连接值的文件。appengine-web.xml
将使用此字段创建cloudsql
CloudSqlServlet.java
中的代码将用作连接 URL 的属性也在
appengine-web.xml
, 我改变了<service>
名称为default
.这个文件实际上不需要更改任何内容,但由于个人喜好,我选择更改服务other required dependencies已经在下载的地方
POM
使用
mvn appengine:deploy
部署到 GAE
这是适用于 MySQL 的 GAE 到 Cloud SQL 连接的最小示例。尝试按照以下步骤测试连接是否适用于提供的代码示例。
关于java - 为什么 Google App Engine JDBC 连接 URL 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52595803/