【问题标题】:Google App Engine query on MySQL in same project with Java使用 Java 在同一项目中对 MySQL 进行 Google App Engine 查询
【发布时间】:2018-01-06 12:51:57
【问题描述】:

我有一个 SQL 实例“MySQL 2nd Gen 5.7”,它必须处理来自 Google App Engine 的简单更新查询操作。

此 Google App Engine 标准 Java 项目服务是使用 JDK 1.8, 日食氧气, 休眠 3, 和经典的 servlet 内容。

每当我从我的计算机上运行该项目时,连接都会正常工作,并且程序将毫无错误地执行。但是当我将它部署到 Google 创建一个新版本时,如果我尝试它,查询页面将加载 30 秒,直到出现错误 500。 错误详情:

网站展示:

错误:服务器错误

服务器遇到错误,无法完成您的请求。 请在 30 秒后重试。

堆栈跟踪的显示:

hbt.HibernateUtil 中的 java.lang.ExceptionInInitializerError。 (HibernateUtil.java:21) 在 dao.TurnoDAO.getTurno (TurnoDAO.java:69) 在 Controlador.Main.getTurno (Main.java:32) 在 RegularizarTurno.doPost (RegularizarTurno.java:33) 在 javax.servlet.http.HttpServlet.service (HttpServlet.java:637) 在 javax.servlet.http.HttpServlet.service (HttpServlet.java:717)

问题是 SessionFactory 不会创建,因为项目无法连接到数据库,就像我的电脑一样。 因此,正如 Google 文档中所说,如果服务在同一个 GoogleProject 中运行,则不会出现访问问题,那么答案不应该是权限方式。

打包hbt;

导入 org.hibernate.SessionFactory; 导入 org.hibernate.cfg.AnnotationConfiguration;

导入实体。*;

public class HibernateUtil{
private static final SessionFactory sessionFactory;
static {
    try {
        AnnotationConfiguration config = new AnnotationConfiguration();
        config.addAnnotatedClass(Turno.class); 
        config.addAnnotatedClass(Persona.class);        


        sessionFactory = config.buildSessionFactory();

   }catch (Throwable ex){
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex); //LINE 21
    }
}  
public static SessionFactory getSessionFactory(){
    return sessionFactory;
}
}

所以,IP 寻址工作正常,权限应该没问题,与编码相关的一切都很好(因为在 2 台电脑上测试过)。我错过了什么?我应该获得任何特殊权限吗?提前致谢

【问题讨论】:

  • 您是否更改了数据库配置?它是否尝试从 google 连接到您的本地数据库?
  • @Konrad 你好,是的,它与本地主机完美连接(这很奇怪)。 db config,hibernate.config 文件是什么意思?一旦项目在 localhost 中运行,我就将其部署到 GAE。谢谢!

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


【解决方案1】:

回答:存在一个奇怪的权限问题,不允许 GAE 访问具有相同项目 ID 的数据库。它通过允许所有网络访问数据库来解决。尽管风险很大,但我们仍然需要一个有密码的用户才能进入。非常感谢。

【讨论】:

  • 如果您使用 Cloud SQL 和 JDBC 驱动程序com.mysql.jdbc.GoogleDriver,那么我相信这会处理权限问题,并且您不需要向所有网络开放您的数据库。
  • @crazystick 确实,这很奇怪。在我允许访问所有网络之前,连接将无法正常工作。
  • 你肯定在使用 com.mysql.jdbc.GoogleDriver 而不是 com.mysql.jdbc.Driver ?您也需要用于生产环境的不同连接字符串,例如jdbc:google:mysql://<proj-id>:<region>:<instance>/<db_name>?user=root 也是。
  • @crazystick 该死的,我没有做到这一点!我只是使用了与常规相同的罐子和命令。我在哪里可以获得适当的文件?非常感谢!
  • 我会尽快检查并编辑“答案”。
猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2019-12-09
相关资源
最近更新 更多