2

これは play 1.2.x での動作と思われるものです: アプリケーションに少なくとも 1 つのモデル/エンティティがあり、したがって JPA に依存しており、データベース接続 (mysql) が失敗している (タイムアウトまたはデータベース ダウン) 場合、コントローラー メソッドは次のエラーで失敗します。メソッドがデータベースを使用しない場合でも、メソッド コードに到達する前に 500 エラーが発生します。

これにより、たとえば、データベースのヘルス チェック コントローラー メソッドや、データベース エラーに対してある程度回復力のあるメソッドを記述することができなくなります。

簡単なプロジェクトでこれを確認しました。再現するには:

  1. 新しいアプリケーションを作成する
  2. 少なくとも 1 つのモデル/エンティティを作成し、mysql データベース接続を定義します。
  3. テキストをレンダリングする (データベースを使用しない) だけの単純なコントローラー メソッドを 1 つ作成し、関連するルート (/playdbtest としましょう) を作成します。

テストするには - アプリケーションを起動して:

  1. データベースが利用可能になったら、playdbtest を呼び出します (動作するはずです)。
  2. mysql をオフにして、データベースがダウンしている間に playdbtest を呼び出します (失敗します)。
  3. エンティティ クラスを無効化/削除し、プレイを再開する / #2 が機能する

質問: その動作を回避したり、エラーをキャッチしたりする方法はありますか? データベース接続が失敗したためにアプリケーションが完全に失敗することはありませんが、要求を処理する機能は損なわれます。

ありがとう。

4

2 に答える 2

1

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);
}
}

遊ぶ!例

于 2012-12-10T07:35:19.183 に答える
1

@NoTransactionソースを見ると、DB 接続を必要としないコントローラー メソッドでアノテーションを使用できることがわかりました。

でエラー ページをカスタマイズできますviews/errors/500.html

于 2012-12-08T12:23:19.070 に答える