`
lxlong
  • 浏览: 81049 次
社区版块
存档分类
最新评论

在系统中生成业务ID的几种方法

    博客分类:
  • java
 
阅读更多

在系统中,除了使用数据库表本身的Id,如何生成各种业务Id?一下记录几种生成Id的方式:

  1. 使用数据库表记录生成的Id,以MySQL为例:

1) 首先创建一个数据库表,来记录当前的业务Id

CREATE TABLE `global_auto_number` (
  `id` varchar(32) NOT NULL,
  `version_optimized_lock` int(11) NOT NULL,
  `business_key` varchar(255) NOT NULL COMMENT 'Can use full business class name as business key',
  `current_num` bigint(22) NOT NULL COMMENT 'current number',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_AUTO_NUMBER` (`business_key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

 2) 获取Id的方法:

int currentCount = jdbcTemplate.update("update global_auto_number set current_num = LAST_INSERT_ID(current_num + 1) where business_key = ?", new Object[] {businessKey});

if(currentCount == 0) {
     jdbcTemplate.update("insert into global_auto_number (id, version_optimized_lock, business_key, current_num) values (?, 1, ?, 0)", new Object[] {UUIDGenerator.generateUUID(),businessKey});
     jdbcTemplate.update("update global_auto_number set current_num = LAST_INSERT_ID(current_num + 1) where business_key = ?", new Object[] {businessKey});
}
return jdbcTemplate.queryForLong("select LAST_INSERT_ID()");

 3) 按照业务逻辑格式化获取的Id。例如:

String.format("SEQ%09d", 123)

 4) 注意事务需要用REQUIRES_NEW,否则在并发环境下会出现大量乐观锁问题。

 

2. 使用随机数来生成随机的Id,例如使用同一个Id来追踪后台响应用户操作的各种log

   public static String generateRandomId() {
      byte[] bytes = new byte[10];
      try {
         SecureRandom.getInstance("SHA1PRNG").nextBytes(bytes);
      }
      catch (NoSuchAlgorithmException e) {
         throw new RuntimeException(e);
      }
      return toHexString(bytes);
   }
   
   final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
   public static String toHexString(byte[] bytes) {
       char[] hexChars = new char[bytes.length * 2];
       for ( int j = 0; j < bytes.length; j++ ) {
           int v = bytes[j] & 0xFF;
           hexChars[j * 2] = hexArray[v >>> 4];
           hexChars[j * 2 + 1] = hexArray[v & 0x0F];
       }
       return new String(hexChars);
   }

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Mysql全局ID生成方法

    既然要sharding,那么不可避免的要讨论到sharding key问题,在有些业务系统中,必须保证sharding key全局唯一,比如存放商品的数据库等,那么如何生成全局唯一的ID呢,下文将从DBA的角度介绍几种常见的方案。...

    H3BPM 试用系统操作手册

    业务服务列表管理中,支持以下几种应用: 1. 新建文件夹:支持把同一个业务所使用的业务服务进行归类管理; 2. 新建业务服务; 3. 上传业务服务; 那么,在本演示环境中使用到的业务服务类型有:Data Table、...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足信息处理的需求。 2、 系统的开放性和系统的可扩充性:系统在开发过程中,应该充分考虑以后的可扩充性。...

    (java se 代码)Bank Account Management System 银行账户管理子系统

    将下一个可用的id存放在文件中,每创建一个新对象的时候都会读取这个文件,获得新对象的id,并且修改文件中的id,使其加1后,再保存到文件中。 2、 修改Bank类中各个业务方法 分析: 要将账户信息全部保存到文件中,...

    ASP设计在线考试系统OnlineTest

    下面就对这几种技术和方法做一个概述。 2.统一的语言 SQL可用于所有用户的DB活动模型,包括系统管理员、数据库管理员、 应用程序员、决策支持系统人员及许多其它类型的终端用户。基本的SQL 命令只需很少时间就能...

    网络安全技术习题.docx

    试列举几种常见的应对方法 何谓操作系统扫描技术?试列举几种操作系统扫描方法 何谓栈指纹技术?主动和被动栈指纹技术有何区别? 如网络安全技术习题全文共7页,当前为第3页。网络安全技术习题全文共7页,当前为第3...

    asp在线考试系统(asp+access实现)

    下面就对这几种技术和方法做一个概述。 2.统一的语言 SQL可用于所有用户的DB活动模型,包括系统管理员、数据库管理员、 应用程序员、决策支持系统人员及许多其它类型的终端用户。基本的SQL 命令只需很少时间就...

    入门学习Linux常用必会60个命令实例详解doc/txt

    -n:一般而言,mount挂上后会在/etc/mtab中写入一笔资料,在系统中没有可写入文件系统的情况下,可以用这个选项取消这个动作。 4.应用技巧 在Linux 和Unix系统上,所有文件都是作为一个大型树(以/为根)的一部分...

    ORACLE重建索引总结

    3 、rebuild online 时系统会产生一个 SYS_JOURNAL_xxx 的 IOT 类型的系统临时日志表 , 所有 rebuild online 时索引的变化都记录在这个表中 , 当新的索引创建完成后 , 把这个表的记录维护到新的索引中去 , 然后 ...

    通用企业网站系统V3.0语言/美工自定义/限制版

    参数说明:classid表示从这个classid的类型中取数据,noclassid表示不从这个classid类型中取数据,classid就类似于您有个新闻类型表,classid=1表示国际新闻。 Pic_width表示显示的图片的宽度;Pic_height表示显示的...

    ssh(structs,spring,hibernate)框架中的上传下载

    将FileActionForm直接作为业务层的接口入参,相当于将Web层传播到业务层中去,即将业务层绑定在特定的Web层实现技术中,按照分层模型学院派的观点,这是一种反模块化的设计,但在"一般"的业务系统并无需提供多种UI...

    asp.net知识库

    在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置? 如何保证页面刷新后的滚动条位置 清除网页历史记录,屏蔽后退按钮! 如何传值...

    JAVA面试题最全集

    76.EJB有哪几种?区别是什么? 77.JavaBean与EJB有什么区别? 78.软件开发生命周期有哪几个阶段? 79.软件开发有哪些因素? 80.软件开发中如何进行版本控制? 81.UML中,类视图如何表示类中的继承与聚合? 82.客户端...

    基于JAVA本地监听与远程端口扫描(源代码+论文).zip

    其他的几个类文件主要是辅助类,以及方法实现类,用来完成响应的业务操作。 3.1.2 功能大体介绍 该程序有以下功能模块: 本地监听:主要实现实时查看操作系统当前运行进程,并根据进程查看本机响应端口和远程计算机...

    UserBasedRecommendationSystem:该项目在相似用户的基础上提供了基于用户的推荐系统。 Apache Mahout库用于开发基于协作的推荐

    有几种方法可以做到这一点。 对于此项目,正在计算相关系数以比较它们之间的相互作用 #Input输入文件具有超过150万条记录,大小约为1.5 GB。 我们已经使用hadoop mapreduce减少了输入文件数据,以仅获取相关数据。...

    计算机应用技术(实用手册)

    这个项目可控制DRAM作用指令与读取/写入指令之间的延迟时间,有2,3,4几种选择。数值越小,性能越好。 DRAM RAS# Precharge: 这个项目是用来控制当预充电(precharge)指令送到DRAM之后,频率等待启动的等待...

    ASP.NET的网页代码模型及生命周期

    生成.aspx页面对应的类后会将该类与cs文件中的类进行协调生成新的类,该类会通过IIS在用户浏览页面时呈现在用户的浏览器中。 4.1.4 创建ASP.NET Web Application ASP.NET网站有一种好处,就是在编译后,编译器将整个...

    网上会展的未来发展趋势

    展会组织者还应该引导展会参加者在网上预定旅店,可以把免费团体住宿安排应用软件、网上预定工具和报名数据库结合起来使用,把所有住宿安排信息都储存在一个在线数据库中,及时监控住宿安排情况,并可以提前几个月或...

    测试培训教材

    定位到“Cruise Search”测试用例,在“设计步骤”界面中选择“生成脚本-&gt;QUICKTEST_TEST” 需要“Launching Quick Test Professional”来进一步地编辑和修改自动化测试脚本。 什么是BPT? 业务组件测试 ...

    Spring.net框架

    在上面这段代码中,重点注意三条命令的使用方法: assembly = Assembly.LoadFile(rootPath + prop.assemblyName); p = assembly.CreateInstance(prop.typeName); t.InvokeMember(prop.propertyName, BindingFlags....

Global site tag (gtag.js) - Google Analytics