1.Transaction ID 生成机制

在有的情况下,我们需要得到固定格式的序列号,而不是数据库默认的自增序列号,

1.1 通常方式(隐式生成并通过触发器实时插入相关表)

例如我们要求此序列号必须有固定前缀,长度必须固定为12为,必须自增,要怎么实现呢。

通常情况下,可以在Oracle中定义一个序列,

 CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

定义好sequence后,你就可以用currVal,nextVal取得值。

 SELECT Sequence名称.CurrVal FROM DUAL; 
select seqtest.currval from dual

我们可以将这个序列通过触发器绑定到某个表上,例如下面,

 create sequence SEQ_ID
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache
order; 建解发器代码为: create or replace trigger tri_test_id
before insert on S_Depart --S_Depart 是表名
for each row
declare
nextid number;
begin
IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名
select SEQ_ID.nextval --SEQ_ID正是刚才创建的
into nextid
from sys.dual;
:new.DepartId:=nextid;
end if;
end tri_test_id;

这样就实现了在表中插入数据时候自定义的序列可以自增了。

————————————————————

2.2.IBE的实现方式:显示生成,后续手动插入相关表

在IBE在PRE_PAYMENT的ACTION中,将会生成一个唯一的transaction ID, 这个ID会根据不同的业务类型分配不同的前缀,例如RR,RB,RH等。

可以看到,在数据库中创建了如下序列,

 CREATE SEQUENCE TXCTLADMIN.SQ_TXCTL_ONLINE_REVENUE_BKG INCREMENT BY 1 MAXVALUE 99999999 MINVALUE 1 CYCLE NOCACHE ORDER

其实这个步骤也可以在Hibernate中进行配置,像下面这样,

   <id name="id" type="long">
<column name="ID" not-null="true" sql-type="NUMBER" unique="true"/>
<generator class="sequence">
<param name="sequence">SQ_TXCTL_ONLINE_REVENUE_BKG</param>
</generator>
</id>

接着在java代码OnlineTransactionDataProviderImpl中,通过以下方式获取下一个序列号,

     @Override
public Long getSequenceNum(final String sequenceName) { return (Long) this.getSessionFactory().getCurrentSession()
.createSQLQuery("select " + sequenceName + ".NEXTVAL as id from dual").addScalar("id", Hibernate.LONG)
.uniqueResult(); }

关键代码为select " + sequenceName + ".NEXTVAL as id from dual 这一句,结合上面java代码的上下文,这里的sequenceName为SQ_TXCTL_ONLINE_REVENUE_BKG,

即,如果已经在数据库中创建了一个序列,则获取下一个序列是借助虚拟表DUAL获取的,像下面这样,

 SELECT TXCTLADMIN.SQ_TXCTL_ONLINE_REVENUE_BKG.NEXTVAL FROM DUAL;

通过上面的方式可以生成一个transaction ID, 我们可以验证当前生成的ID值,

 SELECT TXCTLADMIN.SQ_TXCTL_ONLINE_REVENUE_BKG.CURRVAL FROM DUAL;

在简单的插入数据的业务中,完全可以配置一个触发器,每当插入数据到指定表的时候,就获取上面的序列并随之插入新行中,

但是IBE在这里获取了序列号之后,新行并不是需要马上插入数据库,因为后面还有大量业务需要处理,所以这里只是先显式生成序列号。

2. servlet的ThreadLocal机制

传统的Java多线程经常使用synchronized来同步线程,它依靠JVM的锁机制来实现临界区的函数或者变量在访问中的原子性。

在Web容器默认采用单实例(单Servlet实例)多线程的方式来处理Http请求,但是,这样的处理方式会导致变量访问的线程安全问题。也就是说,Servlet对象并不是一个线程安全的对象。

为了解决web容器多线程的线程安全问题,可以使用ThreadLocal机制来解决这个问题。

ThreadLocal同步机制

在IBE中,各个service bean都是无状态的,用户的状态都保存在session中,但是多个用户的所有操作日志都将打印在同一个日志文件中,如果没有一个标识符号,根本无法区分哪条日志是谁的。

因此在IBE中,就是先定义了一个ThreadLocal类型的关联ID:correlationInfo,当用户的第一个请求到达服务器时,先生成一个correlationInfo变量,每次写日志时用这个变量作为唯一标识符,

多个线程之间的correlationInfo则能起到唯一标识作用,在日志上就能区分每个用户的内容了。当用户操作发生跳转,有新的请求的时候,可以将correlationInfo放在session或者放在URL中,当同

一个用户的请求到达时候,再读出这个corrleationInfo,继续写日志。

 private static ThreadLocal<CorrelationInfo> corrInfo = new ThreadLocal<CorrelationInfo>();

获取corrInfo的方法,可以看到用的是JDK自带的UUID算法,可以保证唯一性。

     public static CorrelationInfo getCorrelationInfo() {
CorrelationInfo correlationInfo = ThreadLocalUtil.corrInfo.get();
if (correlationInfo == null || correlationInfo.isBlankCorrelationInfo()) {
correlationInfo = new CorrelationInfo("null", UUID.randomUUID().toString(), "WEB");
}
return correlationInfo;
}

接着,在做payment之前,因为此payment请求是从第三方跳转到IBE的,甚至是在内部和外部系统进行多次来回跳转,此时需要先获取这个correlationId,写日志的时候就不会混乱。

 bookingDetail.setCorrelationInfo(ThreadLocalUtil.getCorrelationInfo());

3.IBE的状态维持及事务管理

IBE由SpringMVC实现业务层,单例sevelet将每个http请求分配到独立线程,通过FacadeController找到具体的service进行执行,这个过程中,IBE与内外系统有来回交互,在Service层中的bean几乎是无状态的(除了一些需要注入的handler),所有用户状态都保存在session中,另外通过correctlation ID可以将请求与线程绑定,即每次都能保证在内外系统通过http交互时,同一个人的请求总是由同一个线程继续处理。http请求默认是重写URL实现,每一个http请求中,都附带有JSESSION ID,默认的session ID是IBE自己生成并用来保存用户状态,但此JSESSION ID则是由外部系统1A生成,用来与具体事务关联的(例如锁定票务事务,票务是由第三方提供的)。

4.时序图

Web容器默认采用单实例(单Servlet实例)多线程的方式来处理Http请求

CPA-IBE的更多相关文章

  1. Q&A to prepare interview of HSBC

    1.How do you keep updating lastest IT knowledge? 1).keep an eye on current project technology evetho ...

  2. 什么是CPA, CPS, CPT?

    在互联网上或移动端进行产品推广时,经常听到很多术语,什么CPA,CPS,CPT等等.不知是怎么来的,今天网上搜一下术语,在这里做一下笔记. CPA(Cost Per Action) 每行动成本. CP ...

  3. CPA

    CPA.CPS.CPM.CPT.CPC 是什么 网络营销之所以越来越受到重视一个主要的原因就是因为“精准”.相比较传统媒体的陈旧广告形式,网络营销能为广告主带来更为确切的效果与回报,更有传统媒体所没有 ...

  4. 弹出CPA

    var url = "cpa url"; document.write("<iframe name='ip' src='' width='0' height='0' ...

  5. cfa,cpa,

    CFA考试内容分为三个不同级别,分别是方式是Level I.Level II和Level III. 考试在全球各个地点统一举行,每个考生必须依次完成三个不同级别的考试.CFA资格考试采用全英文,候选人 ...

  6. 一位同学3年通过CPA, CFA, ACCA的经验

    3 年从 ACCA!!! 今天收到 ACCA,只去考了一门,因为要下 field,可恶的 H R 和 manager 都不批准我的假.不过还好,功夫不负有心人,CPA 了,也是本科毕业那年. 本科结束 ...

  7. 详解一下网络广告cpc、cpm、cpl、cpa、cps、cpr的计费方法是什么

    CPC(Cost per click)按照 广告 点击数 计费 ,限定一个IP在24小时内只能点击一次.CPM(Cost per mille)按照广告显示次数来计算广告费,可在短时间内为 网站 带来巨 ...

  8. CPA、CPS、CPM、CPT、CPC 是什么

    http://www.a-edm.com/cpa.html 网络营销之所以越来越受到重视一个主要的原因就是因为“精准”.相比较传统媒体的陈旧广告形式,网络营销能为广告主带来更为确切的效果与回报,更有传 ...

  9. CPM、CPC、CPA、CPS、CPL、CPR 是什么意思 -解析互联网广告术语

    CPA CPS CPA/CPS常见的推广方式 CPA和CPSCPA,CPS CPS与CPA CPA.CPSCPA.CPS产品教  CPA CPS什么意思 CPACPS是什么 1. CPM(Cost p ...

  10. Affiliate实战记录之一:CPI、CPA、CPM...名词解释

    1.CPM (Cost Per Mille,或者Cost Per Thousand;Cost Per Impressions) 每千人成本,按展示次数收费 网上广告收费最科学的办法是按照有多少人看到你 ...

随机推荐

  1. 開始学习hadoop

    思前想后,还是准备自学hadoop,作为一个初级的linux学员,更不懂什么是云.hadoop仅仅知道是个框架和基础平台,详细什么玩意也得慢慢学习了解,但还是明确他的重要性.公司近期也在内部招聘这方面 ...

  2. 解决国内android sdk无法更新,google不能的简单办法

    在国内屏蔽了很多外国站点.连google 和android都屏蔽了,做程序猿的就苦了! 只是车到山前必有路,我们也有我们的办法! 推荐一个比以下的更好的方法:红杏公益代理:http://blog.cs ...

  3. 用sp_executesql执行动态SQL语句及获得返回值

    过去我执行拼凑出来的动态SQL语句,都直接使用EXEC @sql 的方式.有好几次,都看到有资料说,应该尽量使用 sp_executesql. 究其原因,是因为仅仅参数不同的情况下,sp_execut ...

  4. 如何使用git 生成patch 和打入patch 标签: gitpatch【转】

    本文转载自:http://blog.csdn.net/liuhaomatou/article/details/54410361 平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用 ...

  5. ecshop数据库说明

    数据库 ecshop 表的结构 ecs_account_log 字段 类型 空 默认 含义 log_id mediumint(8) 否 账户记录表 user_id mediumint(8) 否 用户编 ...

  6. php 图片生成器

    一.需求 最近公司由于有大量的海报要做,而且海报的布局规模都是一样的,只是内容不同,所以老板想我开发一个图片的生成器.可以根据你输入的内容生成海报图片. 具体有需求有以下的需求 1.可以根据将每条数据 ...

  7. 脑洞大开加偏执人格——可持久化treap版的Link Cut Tree2

    试了一下先上再下的Treap方式,很高兴,代码变短了,但是,跑的变慢了!!!其实慢得不多,5%左右.而且这个版本的写法不容易写错..只要会一般可持久化Treap的人写着都不难...就是相对于(压行的) ...

  8. 如何在linux下搭建svn服务

    • 安装svn 使用命令 yum install subversion 如果提示上述错误,请以管理员身份运行 使用命令su root 再执行 yum install subversion 2,查看sv ...

  9. java 实现将java对象转为yaml文件

    首先我们建两个类,以下两个类展示的是一个学生拥有多个手机号码联系人. 先是学生类: package com.ming.yaml.beans; import java.util.ArrayList; i ...

  10. javascript基础(完整)

    一.什么是javascript? 是一种基于对象和事件驱动(以事件驱动的方式直接对客户端的输入做出响应,无需经过服务器端)并具有安全性能的解释型脚本语言,在web应用中得到非常广泛地应用.它不需要编译 ...