1

さまざまなユーザーがデータベースを操作する Java EE Web アプリケーションを作成したいと考えています。ユーザーは、レコードの編集を開始してから、変更を保存するか、編集をキャンセルできます。ユーザーが編集している間、他のユーザーに対してレコードをロックする必要があります。データベース レベルでロックする必要があります。同じデータベースを編集している他の非 Java ユーザーもいて、作業しているレコードをロックしているためです。

基本的な Java + データベースのいくつかは理解していますが、ロックなどの複数ユーザーの操作は苦手です。インターネットでいくつかの例を探していると、Java EE テクノロジのすべての「こんにちは世界」の例では、少なくとも 1 つの別のテクノロジが導入されているように思えます。データベース内のオブジェクトにアクセスするには、JPA を使用します。レコードをロックするには、おそらく JTA をもたらすトランザクションが必要です。JTA を使用するには、JNDI が必要です。これらすべてのオブジェクトを操作するには、おそらく EJB とインジェクションも必要です...そして現時点では、これが本当に問題を解決する最も簡単な方法なのか、それとも何か重要なことを見逃していたのか疑問に思っています。これらすべての技術が必要かどうかはわかりません (必要な場合は、それらを使用します。それらすべてを学ぶ前に確認したいだけです)。私がウェブで見つけた例は、それらを非常に寛大に紹介していることがわかります。

Java EE コードの簡単な例を教えてください。

  • JPAを使用します。

  • 「persistence.xml」ファイルに記述されているデータベースに接続します。

  • テーブルに格納されたプロパティとを持つMyObjectクラスがあります。idnameMYOBJECT

  • データベースレベルでオブジェクトをロックするメソッド (JSP ページから呼び出されるなど) を持つid = 42(同じデータベースにアクセスできる Java 以外のユーザーもオブジェクトを変更できないようにする)、またはレコードが別のユーザーによって既にロックされている場合はエラーを表示するユーザー (別の Java ユーザーまたは非 Java ユーザーのいずれか);

  • nameを指定された値に更新してロックを解放するか、空の文字列が指定されている場合は単にロックを解放する別のメソッド (別の JSP から呼び出されるなど) があります。

ソリューションに導入された新しいテクノロジーごとに、そのテクノロジーを使用した理由を簡単に説明してください。また、そのテクノロジーが新しいライブラリのインストール、構成ファイルの作成または変更、追加のコードの作成などを必要とするかどうか (メソッドを呼び出す JSP ファイルは必要ありません。データベース関連の部分に興味があります。)

(別の詳細: EntityTransaction と UserTransaction の違いについて説明します。私の理解が正しければ、複数のデータベースを使用する場合にのみ JTA が必要です。スキーマが異なる 1 つの Oracle データベースのみを使用する場合にも JTA は必要ですか? はいの場合はサンプル コードは JTA を使用して記述します。)

4

2 に答える 2

12

1) データベース内のレコードをロックしたい場合は、悲観的ロックと呼ばれるものが必要です。このキーワードを覚えておいて、さらなるグーグル検索に使用してください。簡単に言うと、ペシミスティック ロックとは、データベース内のレコードを実際にロックすることを意味します。つまり、Java アプリケーションが悲観的ロックを行うと、レコードは実際にロックされます。そのため、Java 以外の他のプログラムが同じデータベースにアクセスしても、レコードはロックされ、変更できません。

一方、いわゆる楽観的ロックは、ほとんどがふりロックです。おおよそ、「このレコードをロックする必要はない可能性が高いため、実際にはロックしません。何か問題が発生した場合は、後で問題を修正しようとします」というアプローチです。これは実際には意味があり、パフォーマンスを向上させますが、このアプローチの背後にある仮定が正しい状況でのみです。競合が非常にまれであり、後で問題を実際に修正できる場所。あなたがそれをよく理解していない限り(あなたはそうではないようです)、それを使用しないでください。

2)JPAは、データベースをトランザクションなどで使用するための統一されたアプローチであり、オブジェクトをテーブルにマップします。これはおそらくあなたが望むものです。

JTAは同じものに加えて、多くのデータベースでトランザクションを使用するための統一されたアプローチであるため、JPAよりも強力ですが、それは実際には必要のない追加機能を備えていることを意味します. 一方、これらの超大国を使用するには、気まぐれに開始する能力や取引を失うなど、いくらかのコストがかかります. サーバーの必要に応じて、サーバーがトランザクションを管理します。それがどのように機能するかを完全に理解していれば、これがニーズに合っているかどうかがわかります。しかし、そうしない場合は、むしろそれを避けます。あなたの開発環境はデフォルトのオプションとして JTA を提供するかもしれませんが、それはあなたが Skynet を書くことを想定しているからです。JTA を使用しないことで、JNDI、EJB、およびその他の多くの Skynet 関連技術を使用する必要もありません。

3) これを聞いたら、宿題をする時間です。今、あなたは何をすべきかについての考えを持っているからです。「javax.persistence」API ドキュメントをお読みください。

注釈付きの Java クラスを使用して、データベース テーブルを表すことができます。または、昔ながらの SQL クエリを使用できます。または両方、必要に応じて。それらのいずれかを使用して、レコードをロックおよび解放できます。ロックはトランザクション内にある必要があるため、ロックを保持したい場合はトランザクションを保持する必要があります。

于 2013-01-09T14:23:08.987 に答える
-11

私たちはあなたのためにこれを解決しません。あなたはすべてを求めています。自分でコーディングする必要がありますが、JPA ロックのリンクを次に示します。

ヒント:使う@Version

JPAのロックについては、こちらをお読みください

于 2012-10-01T16:14:00.720 に答える