読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

今更ながらJPAの楽観ロックを確認してみました

EclipseLink JPA SQL Server 2008 R2 Java EE 6 NetBeans

色んなところで既に書かれてるので、今日のは完全に自分向けのメモ(^^;

JPAの楽観ロック、知識としては知っていたのですが試したことなくて、ちょうどやる必要が出たので、まずは簡単なサンプルで確認してみました。

プログラムは営業系のシステムをイメージして、商談データがあって、2人の人が同じデータを取得して変更して更新してしまった、という流れです。

環境

環境はWindows 7上のNetBeans 7.3でJava EE 6 & JDK7、GlassFish3.1.2でEclipseLink2.3.2です。データベースはMicrosoft SQL Server 2008 R2。

テーブルは超簡易で以下のようなものです。

商談ID 商談名 Version 作成日 更新日
0 商談1だよ 0 2013-10-10 19:51:55.793 2013-10-10 19:51:56.060

Versionカラムは楽観ロック用に設けたものです。

動作

まず結果から。

サンプルアプリをデプロイして、ブラウザを2つ起動してアクセスします。

f:id:kikutaro777:20131010204737j:plain

f:id:kikutaro777:20131010204743j:plain

1つ目のテキストにDBにある商談ID「0」を指定して「読込」ボタンを押します。
DBから読み込んで商談名が表示されます。

f:id:kikutaro777:20131010204836j:plain

f:id:kikutaro777:20131010204840j:plain

IEのブラウザは「商談2なんです」と名称を書き換えます。
もう1つのFirefoxでは「商談3なんだよ!」と名称を書き換えます。

f:id:kikutaro777:20131010205017j:plain

f:id:kikutaro777:20131010205021j:plain

で、各々で「保存」ボタンを押下!

NetBeansではブレイクポイントで複数のスレッドが止まると以下のような歯車マークになります。
f:id:kikutaro777:20131010205241j:plain

NetBeansのマルチスレッドデバッグは過去に書いてました。
NetBeansでマルチスレッドデバッグ

oppFacade.edit(myOpp)という所でEJB側でDB保存処理されます。
成功したのでDBを確認します。

f:id:kikutaro777:20131010205402j:plain

保存されてますね。そしてVersionカラムの値が「1」とカウントアップされてます(^^)
ここに関しては後程。

ではもう1つのFirefoxから来たほうのスレッドに切り替えて

f:id:kikutaro777:20131010205504j:plain

保存処理を実行してみます。

f:id:kikutaro777:20131010205511j:plain

するとエラーに!

GlassFishをみると

f:id:kikutaro777:20131010205626j:plain

OptimisticLockExceptionとなっています(^^)取得した時点でVersionが0で、書き込もうとしたらVersionが既に1となっていたため、「誰かが書き込んだやろ」と判定した流れかと。

EJB使うとBean側ではjavax.ejb.EJBExceptionに成り代わってしまうのが悲しいですが、EJB側でちゃんとcatchすればいける…のかな多分(^^;未確認

@Versionアノテーション

やったことは単純で、2つだけです。

  • テーブルのカラムにintの「Version」を設ける
  • Entityの上記カラムに該当する項目に@Versionのアノテーションを付与する
@Column(name = "Version")
@Version
private int version;

だけです。すんなり思い通りに動いたので良かった(^^)

ちなみにEclipseLinkの楽観ロックに関する記述は以下でした。
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Locking#Optimistic_Locking
最後の1文に「java.sql.Timestamp型も使えるけど、numeric typeをおススメします」と書いてあるのが気になる(^^;

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村