当前位置: 首页 > news >正文

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

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

で、今回の案件。

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

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

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

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

Java スレッドの排他制御 synchronizedメソッド‐ニコニコ動画(ββ)
http://www.nicovideo.jp/watch/sm2346912

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

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

こんな感じの仕様です。

public abstract class AbstractService<ENTITY> extends S2AbstractService<ENTITY> {

    public synchronized int generateId(String key) {
        int id;

        IdGenerator idGen = jdbcManager
            .from(IdGenerator.class)
            .where("key = ?", key)
            .getSingleResult();

        if (idGen == null) {
            id = 1;

            idGen = new IdGenerator();
            idGen.key = key;
            idGen.value = 2;
            jdbcManager.insert(idGen).execute();
        }
        else {
            id = idGen.value;

            idGen.value = id + 1;
            jdbcManager.update(idGen).execute();
        }
        return id;
    }
}

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

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

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

转载于:https://www.cnblogs.com/aggavara/archive/2012/09/29/2708720.html

相关文章:

  • Qt学习之路(54): 自定义拖放数据对象
  • 创建 Silverlight 应用程序以访问 SharePoint 2010 数据
  • Qt学习之路(53): 拖放技术之二
  • OPPM 一页纸项目管理 One-Page Project Management
  • Qt学习之路(52): 拖放技术之一
  • C# 图片识别(支持21种语言)【转】
  • Qt学习之路(tip): Qt容器和算法拾遗
  • 使用 vimdiff 來呈現 Git diff 差異
  • android 开发Eclipse 快捷键
  • Qt学习之路(51): QByteArray和QVariant
  • 我该如何奋斗?
  • Qt学习之路(50): QString
  • 原创:C语言贪吃蛇代码
  • Qt学习之路(49): 通用算法
  • 【转】解决:SecureCRT在Linux下vim显示utf-8编码的文件乱码
  • Angular6错误 Service: No provider for Renderer2
  • C学习-枚举(九)
  • HomeBrew常规使用教程
  • IDEA 插件开发入门教程
  • Javascript设计模式学习之Observer(观察者)模式
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Vue.js源码(2):初探List Rendering
  • 规范化安全开发 KOA 手脚架
  • 详解移动APP与web APP的区别
  • 一天一个设计模式之JS实现——适配器模式
  • Java总结 - String - 这篇请使劲喷我
  • ​比特币大跌的 2 个原因
  • # Apache SeaTunnel 究竟是什么?
  • (C语言)逆序输出字符串
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (三)终结任务
  • (算法)Game
  • (学习日记)2024.01.09
  • (一) storm的集群安装与配置
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net连接MySQL的方法
  • .net专家(张羿专栏)
  • @RequestBody的使用
  • @ResponseBody
  • []常用AT命令解释()
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [autojs]autojs开关按钮的简单使用
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [codeforces] 25E Test || hash
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败