S2JDBC テーブルを利用した独自仕様のid採番メソッド

AS400のDB2では、通常ではトランザクションが扱えないようです。ただし、ジャーナル処理を設定すれば扱えるようになるみたいです。*1

で、今回の案件。

  • ジャーナルは作成しない
  • IDはテーブルを使って採番

という方針があり、それと関連してFOR UPDATEについてあれこれ調べたりしてました。

DB2で「SELECT … FOR UPDATE」のロックを検証 – 130単位
S2JDBC DB2DialectでのforUpdate()を調べてみた – 130単位

さて、Javaには「synchronized」という修飾子があるそうです。これをメソッドの宣言に記述すれば、排他処理が行えるとのこと。

というわけで、S2JDBCのサービスにid採番用のメソッドを書いてみます。

  • 採番用テーブルのカラムはkeyとvalueのみ
  • エンティティを作成してSQL自動生成で記述
  • 各サービスから扱えるようにAbstractServiceに定義
  • 最初の採番時、対象キーのレコードが無くても動作可
  • valueカラムの現在値=次に採番される値

こんな感じの仕様です。

で、synchronizedが実際に効くのかどうか試してみましたが、いまいちわかりませんでした。

  1. トランザクションは無しに設定
  2. メソッドの採番中にユーザーAのみ分岐されるThread#sleep()を仕込む
  3. ユーザーAにて採番実行
  4. ユーザーBにて採番実行

こんな手順でやってみたのですが、synchronizedがない状態でも3の時点で止まってくれました。おそらく検証方法がまずいのか、理解が足りないかのどちらかかと思われますが…。考えてもわからないので、ひとまず一区切りとしたいと思います。

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92146 人正在系统学习中 相关资源:番茄助手2017破解版_vs2017番茄助手-C++工具类资源-CSDN文库

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2012年8月25日
下一篇 2012年8月26日

相关推荐