事务属性主要用于控制事务的作用域。

假设ma是一个事务a,mb是一个事务b,当ma调用mb时,是在哪个事务作用域中执行的?这个取决于mb的事务属性了。

事务属性支持如下6个值

1,Required

如果ma正处于某个事务上下文中,ma调用了mb方法,则mb直接处于ma所在的事务的作用域中执行。如果ma没有处于任何事务中,容器会自动为mb启动一个新的事务。这个属性值适合绝大多数EJB事务,建议将其设置为默认的,至少在开发阶段。EJB事务属性是声明式的,后期也可以很容易修改。

2,RequiresNew

如果ma在事务中,此时容器采用如下操作

1)挂起ma的当前事务

2)为mb启动一个新的事务

3)执行mb的方法

4)mb执行完毕后,恢复ma的事务

如果ma不在事务中,则启动一个新的事务。也就是说此属性值总会为mb启动一个新的事务。

3,Mandatory

如果ma在事务中,则mb在ma的事务的作用域中运行。如果ma没有在事务中,则容器会抛出TransactionRequiredException。

4,NotSupported

如果ma在事务中,此时容器采用如下操作

1)挂起ma的当前事务

2)执行mb方法

3)执行完毕后,恢复ma的事务。

如果ma不在事务中,则容器也直接执行mb,不会为他启动任何事务。

5,Supports

如果ma在事务中,则mb在ma的事务中运行。如果ma不在事务中,则容器正常执行mb,不会为其启动事务。

6,Never

如果ma在事务中,容器会抛出RemoteException。如果ma不在事务中,则容器正常执行mb,不会为其启动事务。

为EJB设置事务属性,可以通过使用javax.ejb.TransactionAttribute Annotation来标注EJB或方法,并将其值设置为javax.ejb.TransactionAttributeTyep枚举值之一。取值就是上面的介绍内容。如TransactionAttributeType.REQUIRED。

如果修饰类,则代表EJB中所有的方法都使用该属性值。

EJB有两种事务管理方式,这两种方式通常都建立在JTA基础之上,一种是通过容器管理事务(CMT)以声明式方式来管理事务;另一种则在EJB内部使用事务管理代码自己管理事务,这种方式也被称为Bean管理事务(BMT)。

EJB默认使用容器管理事务的策略。容器总是在业务方法的开始、结束处标记事务边界,也就是说,容器将在调用方法之前开始JTA事务,然后根据方法的调用情况来决定提交或回滚事务。当使用CMT事务管理策略时,开发者无需为事务控制编写任何代码,只需要通过Annotation或XML配置文件告诉容器如何处理事务即可。当使用CMT时,业务方法不应该调用任何可能与容器所设置事务边界冲突的方法,如下情形都是被禁止的。

1)禁止调用Connection接口的commit、setAutoCommit和rollback方法

2)禁止调用EJBContext的getUserTransaction方法

3)禁止调用UserTransaction的任何方法

CMT的最大优点是简单、方便,但是它不够灵活。与CMT相比,BMT则可由开发者来决定业务方法中的事务边界,对于BMT来说,程序代码中不要调用EJBContext接口中的getRollbackOnly和setRollbackOnly方法,允许调用UserTransaction的方法来手动控制事务。

weblogic设置事务的超时

<xa-set-transaction-timeout>true</xa-set-transaction-timeout>

<xa-transaction-timeout>5</xa-transaction-timeout>

jboss设置事务的超时

<xa-resource-timeout>10<xa-resource-timeout>

JNDI的全称是 Java Naming Directory Interface,即Java命名目录接口,它允许Java程序通过一个名称来访问真正的Java对象。

RMI指的是Remote Method Invoke(远程方法调用),RMI为Java分布式应用编程提供了基础,RMI底层依然是依赖于Socket网络通信来实现的。

RMI也离不开JNDI,当RMI服务器希望把自己提供的远程方法暴露出来时,就要为自己绑定一个JNDI名称,而RMI客户机则通过JNDI查找来获取远程RMI服务器,然后调用RMI服务器上的远程方法。

JNDI结构包含两组API:JNDI API和JNDI SPI(Service Provider Interface)。开发者使用JNDI API以一致的方式来访问各种命名、目录服务,而JNDI SPI则保证各种命名、目录服务透明地加入JNDI结构中,Naming Manager则负责管理他们二者之间的转换。

JNDI编程

1)创建Context对象

2)调用Context的方法来执行绑定、查找等操作

3)关闭Context

由于Context只是一个接口,因此通常会使用它的实现类InitialContext来创建实例。

InitialContext提供了如下两个构造器:

1)InitialContext():读取系统属性作为Context属性来创建InitialContext

2)InitialContext(Hashtable<?,?> environment):以environment参数指定的属性作为Context属性来创建InitialContext

其中传入的Hashtable作为参数,该Hashtable至少包括如下两个key

java.naming.factory.initial:可用Context内的INITIAL_CONTEXT_FACTORY常量代替。该key的值应该为初始化Context的工厂类。

java.naming.provider.url:可用Context内的PROVIDER_URL常量代替。该key的值应该为Context服务提供者的URL。

例如

Hashtable env=new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,“com.sun.jndi.fscontext.RefFSContextFactory”);

env.put(Context.PROVIDER_URL,“file:/g:/test/”);

Context ctx=new InitialContext(env);

一旦获取了InitialContext对象之后,就可以执行JNDI的相关操作了。

1)查找对象

通过lookup(jndi)方法来实现,该方法接收被绑定的JNDI名,返回与之绑定的对象。由于该方法返回一个Object类型,因此需要强制类型转换

ServiceBean service=(ServcieBean)ctx.lookup(“service”);

2)绑定

JNDI通过bind(String name,Object obj)方法来执行绑定,第一个参数是被绑定的JNDI名,第二个参数是被绑定的对象。执行完该方法后,相当于为obj起了一个name名称。

ServiceBean service=new ServiceBean();

ctx.bind(“service”,service);

3)重新绑定

rebind(String name,Object obj)与绑定的功能基本相似,但是比bind方法更健壮,如果调用rebind方法将某个名字重新绑定到指定对象上时,如果该名字已被绑定过,那么这个已绑定过的名字会重新绑定到新的对象上;如果使用bind方法,则会引发NameAlreadyBoundException异常。如果该名称没有被绑定过,那么rebind方法的功能和bind方法的功能相同。

WebLogic访问被绑定的对象

String factory=”weblogic.jndi.WLInitialContextFactory”;

String url=”t3://localhost:7001”;

执行之前需要将Middleware\wlserver_10.3\server\lib路径下的webservices.jar、wlclient.jar加入classpath中

JBoss访问被绑定的对象

String factory=”org.jnp.interfaces.NamingContextFactory”;

String url=”jnp://localhost:1099”;

执行之前需要将client路径下的jbossall-client.jar、jnp-client.jar、jboss-logging-spi.jar加入classpath中。

【JavaEE】经典JAVA EE企业应用实战-读书笔记2相关推荐

  1. Java EE企业应用实战

    前 言 目前Java EE应用的开发方式大致可分为两种:一种以Spring.Hibernate等开源框架为基础,这就是通常所说的轻量级Java EE应用:另一种则以EJB 3+JPA为基础,也就是本书 ...

  2. 轻量级java ee企业应用实战第4版 源码下载

    光盘下载地址   http://pan.baidu.com/s/1qWQboT2    提取密码  x7ni

  3. java ee核心框架实战 pdf_Java EE核心框架实战 高洪岩 中文PDF

    资源名称:Java EE核心框架实战 高洪岩 中文PDF 第1章 MyBatis 3操作数据库 第2章 MyBatis 3常用技能 第3章 Struts 2必备开发技能 第4章 Struts 2文件的 ...

  4. 《Java EE核心框架实战》—— 2.3 resultMap 标签

    本节书摘来异步社区<Java EE核心框架实战>一书中的第2章,第2.3节,作者: 高洪岩,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.3 < re ...

  5. Java EE企业系统性能问题的原因和解决建议

    Pierre-Hugues Charbonneau(昵称是P-H)是加拿大CGI公司的高级IT顾问和系统架构师.近日他发表了题为<导致Java EE企业性能问题的十大原因>的文章,列举了对 ...

  6. Spring4实战读书笔记

    Spring4实战读书笔记 首先,我们需要明白,为什么我们需要引入Spring,也就是说Spring的好处.个人觉得主要是在于两方面解耦和对bean的管理. 第一部分:Spring核心 共分为四个章节 ...

  7. JAVA WEB整合开发王者归来 -- 读书笔记 by CZF 完整版

    JAVA WEB整合开发王者归来 -- 读书笔记  目录 第1章 概述. 1 第2章 搭建web开发环境. 1 第3章 Servlet技术. 1 第4章 深入JSP技术. 7 第5章 会话跟踪. 12 ...

  8. Go语言实战读书笔记

    2019独角兽企业重金招聘Python工程师标准>>> Go语言实战读书笔记 第二章 通道(channel).映射(map)和切片(slice)是引用类型.引用类型的对象需要使用ma ...

  9. 《Java多线程编程核心技术》读书笔记

    为什么80%的码农都做不了架构师?>>>    <Java多线程编程核心技术>读书笔记. ###第一章 Java多线程技能 使用Java多线程两种方式. 继承Thread ...

最新文章

  1. Appro DM8127 IPNC 挂载NFS遇到的问题及解决
  2. android siri 源码,Android的SIRI 。
  3. 全球及中国矢量超导磁体行业“十四五”竞争状况及投资前景策略分析报告2021-2027年版
  4. 展示 测速_科技产品 | 人工智能amp;科技展示厅——助力高校人工智能学科建设及产业人才培养...
  5. 【caffe-Windows】训练自己数据——数据集格式转换
  6. [css] border-radius:50%和border-radius:100%有什么区别?
  7. JS file图片即选即得显示,前端交互图片即选即得
  8. Eclipse之Project facet Java version 1.8 is not supported.
  9. DOS中的 及 用正则表达式中的什么替掉
  10. ConcurrentHashMap面试灵魂拷问,你能扛多久
  11. Linux下如何判断磁盘类型,Linux下判断磁盘属于U盘、HDD盘或者SSD盘的方法
  12. sigprocmask系统调用
  13. 蓝桥杯2020年第十一届C/C++国赛B组第二题-扩散
  14. 基于Xamarin移动测试云测试你的Android/iOS移动应用
  15. Windows XP 下如何用 Modem 发传真
  16. 2.1.1队列——雏形(初始版本)
  17. C++complex复数类
  18. openssl 1.0.2k-fips 升级到 openssl-3.0.5
  19. python爬虫入门技术手册
  20. css中div的意思是什么

热门文章

  1. 光电对抗发现历史、内容、原理及发展趋势
  2. iTunes Converter for mac(音频格式转换工具)
  3. 2019关于闪存芯片NAND FLASH的封装介绍
  4. VSCode更新失败无法打开,快捷方式无法正常工作
  5. 从零开始设计一个漂亮的网页(译)
  6. One_DPLayer -一款简单好用的在线播放器[DPLayer]
  7. python中\t \r \s \n \f各种转移字符含义
  8. 那些年啊 那些事——一个程序员的奋斗史 ——89
  9. quartz集群模式下qrtz_triggers表trigger_state变ERROR分析
  10. 网络安全HW系列之应急响应方法论思维导图