如果数据库关闭,所有控制器都会以500失败(播放1.2.5)-我可以覆盖这种行为吗



这似乎是play 1.2.x中的行为:如果一个应用程序至少有一个模型/实体,因此依赖于JPA,并且数据库连接(mysql)失败(超时或数据库关闭),则控制器方法在到达方法代码之前失败,并出现500错误,即使该方法不使用数据库。

例如,这可以防止编写数据库健康检查控制器方法,或对数据库错误具有一定弹性的方法。

我已经用一个简单的项目验证了这一点。复制:

  1. 创建新应用程序
  2. 至少创建一个模型/实体,并定义一个mysql数据库连接
  3. 创建一个简单的控制器方法,只渲染文本(不使用数据库)和相关的路由(比如/playdbtest)

要测试-启动应用程序并:

  1. 当数据库可用时调用playdbtest(应该可以工作)
  2. 关闭mysql并在数据库关闭时调用playdbtest(将失败)
  3. 禁用/删除实体类并重新开始播放/#2将起作用

问题:有没有办法规避这种行为或发现错误?应用程序不应该因为数据库连接失败而完全失败,尽管它为请求提供服务的能力会受到损害。

谢谢。

查看源代码,我发现您可以在不需要DB连接的控制器方法上使用注释@NoTransaction

您可以在views/errors/500.html中自定义错误页面。

除了samuel的答案,您还可以捕获控制器上的错误。

public class Admin extends Application {
@Catch(IllegalStateException.class)
public static void logIllegalState(Throwable throwable) {
Logger.error("Illegal state %s…", throwable);
}
public static void index() {
List<User> users = User.findAll();
if (users.size() == 0) {
throw new IllegalStateException("Invalid database - 0 users");
}
render(users);
}
}

玩!示例

最新更新