2

Web アプリケーションに信頼性を組み込むための解決策を見つけようとしています。ネットワーク接続/データベース接続が失われた場合、SQL をデータと共にダンプする計画です。現在の実装では、Rest コントローラー、サービス、DAO があります。DAO が をスローPersistenceExcetpionし、それが Controller レイヤーまで伝搬されます。

コード例:

public MyDAOClass {
    public void save(Object object) {
        try {
            entityManager.persist(object);
        } catch (PersistenceException e) {
            throw new DBException("Error occurred in save", e);
        }
    }
}

これDBExceptionはランタイム例外です。

さて、実際の質問が来ます。チームメイトの 1 人が、たとえば次のようなカスタム例外を設定することを提案しました。InsertException, UpdateExceptionこれらの例外のいずれかが発生した場合、そのエンティティに対してどの操作が実行されたかがわかるため、適切な sql としてファイルに保存できます。

例えば。コードがEmployeeエンティティの保存に失敗したとしましょう。これにより がスローInsertExceptionされ、そのエンティティの insert sql ステートメントとしてファイルにエントリが作成されます。insert into employeee values ('firstname','lastname');

私にとって、接続が失われたときにSQLファイルの作成を実装するという考えは、上記の実装ほど単純ではないようです。

私が提唱した質問は次のとおりです。1) 複数のアクション (挿入、更新、削除の任意の組み合わせなど) がサービス メソッドで実行された場合、どのように処理しますか? 2) さまざまな例外についてはどうですか? PerisistenceExceptionつまり、接続の問題だけでなく、制約の失敗、エンティティが見つからないなどの理由が考えられます。

すべての異なる条件も考慮する上記のシナリオを実装する方法はありますか。

ありがとう。

更新: chrylis のコメントに基づきます。私はすでにこれを質問に追加しているはずです。これは、さまざまな小売店でローカルに実行されている Web アプリケーションです。また、アプリケーションにダウンタイムが発生することはあり得ないため、接続に問題が発生した場合でも、アプリは動作し続ける必要があります。ファイルは後で中央データベース サーバーと同期されます。

4

1 に答える 1

0

春には、データをデータベースに保存する Hibernate ORM があります。リクエスト中に例外が発生した場合、休止状態によってロールバックされます。これは、@Transnational アノテーションを配置する場所によって異なります。

トランザクションを処理するサービス層を使用します。したがって、データベース操作またはその他の操作がサービス層で失敗し、例外がスローされた場合、トランザクションは休止状態によって自動ロールバックされます。次に、Spring 例外リゾルバーを使用して例外を処理し、ログとユーザーにカスタム エラーを書き込みます。興味深い場合は、例外を別のデータベースに保存することもできると思いますが、それらをログに記録するだけで十分だと思います。

この記事では、一般的な例外処理について詳しく説明します。

これが例外リゾルバーです。

import ...

@ControllerAdvice
public class SpringExceptionResolver {

    Logger logger = LoggerFactory.getLogger("com.realitylabs.event.controller.RecoverController"); 


    @ExceptionHandler({CorruptedSessionUserException.class})
    @ResponseBody
    @ResponseStatus(value=HttpStatus.FORBIDDEN)
    public ErrorObject userNotFoundExceptionHandler() {
      // Handle exception
      // log using the logger.
      // We usually return an error object in JSON so that we can show custom    // error messages.
    }


}

サービスは次のようになります。通常、コントローラーからサービスを呼び出します。コントローラーから来るときに例外がスローされた場合、アドバイスはそれを処理します。

import ...

@Service(value="ObjectService")
@Transactional
public class ObjectServiceImpl implements ObjectService {

  @Autowired
  private ObjectDAO objectDAO;

  @Override
  public Object get(int id) {
    Object o = objectDAO.get(id);
    Hibernate.initialize(o.getVoters());
    return o;
  }

}

これが役立つことを願っています。

于 2015-12-20T10:23:33.633 に答える