【问题标题】:Connect to Cloud SQL with Google App Engine Endpoint使用 Google App Engine Endpoint 连接到 Cloud SQL
【发布时间】:2015-02-02 14:09:15
【问题描述】:

我正在尝试将我的后端端点代码连接到谷歌云 sql 数据库。我已经使用 MySQL 工作台成功创建并创建了数据库和表。当我尝试在用户表中插入一个新用户时,我在执行查询时得到一个 java.lang.NullPointerException。请看下面的代码:

@ApiMethod(name="registerUser")
public User addUser(@Named("name") String name, @Named("email") String email, @Named("rotation") double rotation,
        @Named("p1email") String p1email, @Named("p2email") String p2email, @Named("password") String password) throws NotFoundException {
    //Check if already exists
    Connection conn = dbConnection.getConnection();
    User u = null;
    try {
        String query = "SELECT * FROM users WHERE email = '"+email+"'";
        java.sql.ResultSet rs = conn.createStatement().executeQuery(query);
        if(rs != null){
            throw new NotFoundException("User email is already used");
        }else{
            java.sql.PreparedStatement statement = conn.prepareStatement("INSERT INTO users (name,email,p1email,p2email,password,rotation) VALUES ( ?, ?, ?, ?, ?, ?)");
            statement.setString(1, name);
            statement.setString(2, email);
            statement.setString(3, p1email);
            statement.setString(4, p2email);
            statement.setString(5, password);
            statement.setDouble(6, rotation);
            statement.execute();
        }
        String query2 = "SELECT * FROM users WHERE email = '"+email+"'";
        java.sql.ResultSet rs2 = conn.createStatement().executeQuery(query2);


        if(rs2 != null){
            while(rs2.next()){
                u = new User(rs2.getInt("id"), name, email, p1email, p2email, password, rotation);
            }
        } 
    }catch (SQLException e){
        throw new NotFoundException(e);
    }
    return u;
}

连接数据库的代码是:

public java.sql.Connection getConnection(){
    try{
        Connection conn = DriverManager.getConnection(
          "jdbc:google:mysql://your-project-id:your-instance-name/database",
          "user", "password");
        }catch(Exception e){
            conn = null;
        }
    return conn;
}

我在第一个代码sn-p中得到了这句话中的java.lang.NullPointerException:

 java.sql.ResultSet rs = conn.createStatement().executeQuery(query);

【问题讨论】:

  • 这种情况是部署在 GAE 上还是在使用 devserver 的本地计算机上运行时发生?
  • 它在本地和 GAE 上都发生

标签: java mysql database google-app-engine endpoint


【解决方案1】:

问题是当你到达这条线时,'conn' 肯定是空的。原因是 DriverManager.getConnection 引发了异常,而 getConnection() 显式返回了“null”。

现在的问题是为什么 DriverManager.getConnection 会抛出异常?由于您正在吞下所有异常并且没有记录任何内容,因此您只能尝试猜测。一般来说:

  1. 吞下所有异常是不好的。你应该只抓住那些 您打算处理的异常。
  2. 如果您捕获到异常,您通常应该记录它。在这种情况下 你需要知道为什么 DriverManager.getConnection 会抛出异常 首先。

因此,下一步是重构您的代码,使其更易于调试,从日志中获取异常详细信息并从那里开始工作。如果原因不明显,请随时使用新信息更新问题。

【讨论】: