Hatena::ブログ(Diary)

アガテナ

2008-02-08

[]JPA(S2JDBC)でシーケンスのアロケートサイズがデフォルト50な件 JPA(S2JDBC)でシーケンスのアロケートサイズがデフォルト50な件を含むブックマーク

S2JDBCを使っていて、シーケンスを普通に1づつのインクリメントで作成していてはまりました。

CREATE SEQUENCE PROJECT_ID;

上記定義だと、実際にシステムが発行するシーケンス番号と、

DB上のシーケンスの現在値が不一致になって、再起動したりしたタイミングで重複エラーになります。

実際は以下のように定義する必要があります。S2JDBCドキュメントにはしっかり書いてありますが、なんで50なのか?っていうところが気になります。

http://s2container.seasar.org/2.4/ja/s2jdbc_entity.html

CREATE SEQUENCE PROJECT_ID INCREMENT BY 50;

これはシーケンスを毎回DBにとりにいくのではなくて、デフォルトで50回に1回だけDBに問い合わせて、その後は50のサイズを使い切るまではJPA側でインクリメントするというJPA仕様みたい。気になるのは、Webサーバを複数立てたりしたときですが、それぞれのプロセスで50づつのレンジを確保してシーケンスを発行していくのでしょう。

これ、結構はまりやすいポイントだと思うんですけど、それほどシーケンス値取得のコストってかかるんですかね。システム上のアロケートサイズ(@SequenceGeneratorで変更可能)とDBのシーケンスのインクリメントの値を一致させるっていうのも、結構はまりやすい気がするのですが、このテクニックって一般的なんでしょうか?

あと、JPA以外からおなじテーブルにインサートする場合、シーケンスが大量消費されそうな気がします。問題はないのかもしれないけど。

[]JPA(S2JDBC)のシーケンスを毎回取得するように設定するには? JPA(S2JDBC)のシーケンスを毎回取得するように設定するには?を含むブックマーク

以下のように設定すればOK。

CREATE SEQUENCE PROJECT_ID;
@javax.persistence.Id
@javax.persistence.GeneratedValue(strategy = javax.persistence.GenerationType.SEQUENCE, generator="project_seq")
@javax.persistence.SequenceGenerator(name="project_seq", sequenceName="project_id", allocationSize=1)
private Integer id;

higayasuohigayasuo 2008/02/08 12:49 デフォルト50は、JPAで決まっていた気がします。
SEQUENCEのキャッシュはスピードに結構影響します。
自分で試してみるのがいいと思います。

agtagt 2008/02/08 12:57 SEQUENCEのキャッシュはスピードに結構影響します。< なるほど、やっぱりそうですか。今度試してみます。

t-wadat-wada 2008/02/08 13:04 この方法は、『EJBデザインパターン』にあったSequence Blocksというパターンではないかと思います

通りすがり通りすがり 2008/02/08 15:58 [Cubby - セットアップ]にある通りにmvn archetype:createを使用して雛型を生成したのですが、
mvn tomcat:run を実行すると起動中にorg.seasar.framework.exception.SAXRuntimeExceptionが発生しました。
どうもjdbc.diconが文字化けしているのが原因なのですが確認して貰えないでしょうか?

y-babay-baba 2008/02/08 20:10 archetype.xmlにリソースのエンコーディングが指定されていないため、文字化けしてしまっています。
とりあえずは mvn archetype:create の実行前に set MAVEN_OPTS=-Dfile.encoding=UTF-8 を実行してエンコーディングを指定しておくと文字化けを回避できますので試してみてください。

通りすがり通りすがり 2008/02/09 00:03 回答ありがとうございます。
set MAVEN_OPTS=-Dfile.encoding=UTF-8を実行することにより起動出来るようになりました。
ただ、出力されるログが文字化けしてしまいますが正常に動作しているので問題ないです。

agtagt 2008/02/09 14:31 よかったです。次回リリースから、Windowsでも動作するように設定しておきます。

トラックバック - http://d.hatena.ne.jp/agt/20080208
Connection: close