回顾经典--EJB3.0 上

白云_飘飘 2013-06-03 01:08:26
这是我学习EJB3.0的笔记,希望对大家有用,更希望志同道合者提出宝贵意见或见议

J2EE笔记

J2EE开发平台主要分为两支:一支以Spring,Hibernate两大框架为核心构建的轻量级应用,无需应用服务器支持,在TOMCAT等WEB服务器上即可运行良好;一支以EJB3为核心构建,这类应用需要EJB容器支持,JBOSS,
WEBLOGIC,WEBSHARE等应用服务器都可运行;

J2EE应用分层模型--轻量级J2EE应用依靠Spring的IOC管理各层组件的依赖关系,实现各层组件间的松耦合,以提供更好的扩展性,J2EE应用也有类似分层模型而无本质区别,只是实现技术不同
而已,它的各层组件分别是:表现层组件,控制器组件,业务逻辑组件,EAO组件,领域对象组件;
(1)表现层组件--负责用户输入和显示数据的JSP,以及FreeMarker等;
(2)控制器组件--即MVC框架,它提供了一个负责拦截和转发用户请求的核心控制器,用户请求通过核心控制器转发给用户实现的控制器组件,用户实现的控制器组件通过调用业
务逻辑方法处理用户请求;
(3)业务逻辑组件--其通过Session Bean实现系统的业务逻辑,常用一个业务逻辑方法对应一次请求且是一个整体,故需要对业务逻辑方法增加事务性且只负责实现业务逻辑
而不应该进行数据库访问;
(4)EAO组件--EAO(Entity Access Object)实体访问对象也通过Session Bean实现,相当于DAO对实现进行CRUD操作,JPA规范中的Entity是POJO且替代DTO传输数据,
故DAO又叫EAO;
(5)领域对象组件--Entity抽象了对象模型且将状态保存到数据库中,每个Entity对应数据库中的一张或多张表;
JBOSS--它是很著名的开源的J2EE应用服务器,由纯JAVA实现的与平台无关的且完全免费,run.bat -c <config_name>可启动对应功能的JBOSS服务器,默认启动default功能的服务器;
(1)修改访问端口--JBOSS已内嵌且掌管TOMCAT包含其日志,可以通过修改TOMCAT的server.xml配置文件修改相关配置信息,但发布的应用只需放在JBOSS的自动布署目录即可;
(2)修改Administration Console的登录名和密码--通过它可以实现查看和管理JBOSS支持的各种服务,打开\server\default\deploy\admin-console.war\WEB-INF\web.xml
可配置登录角色名,打开同目录的jboss-web.xml可配置控制访问该WEB应用的角色和用户,打开
\server\default\conf\login-config.xml可配置所有的安全域信息,通过修改对应的properties文件可实现修改对应角色
的用户密码信息;
(3)修改JMX Console的登录名和密码--通过它可以查看JBOSS支持的各种服务,此控制台对JBOSS安全非常重要,应为它增加JAAS控制,通过修改
\server\default\deploy\jmx-console.war\WEB-INF\jboss-web.xml可以实现,打开此文件去掉注释,可配置安全域,并且为其配置安全
策略,待保护的URL,允许访问的角色,打开同目录web.xml去掉<security-constraint>的注释可配置保护的所有资源和允许访问的角色信息;
(4)布署web应用--JBOSS布署应用有两种方式:自动布署和控制台布署,
自动布署--将已发布的应用(EJB/WEB)复制到\server\default\deploy\目录即可;
控制台布署--首先登录Administration Console,单击Web Application (WAR)s节点后单击add a new resource按钮;
WEBLOGIC--它价值不菲,也带来了稳定的性能和极高的易用性,具体启动和创建域可参看readme.txt,布署web应用有三种方式:自动布署,控制台布署,修改配置文件布署,
(1)自动布署--复制已发布的应用到域的autodeploy路径下即可;
(2)控制台布署--域结构->布署->安装[复制应用目录]->next to complete;

1.事务--事务是由一步或几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行,它具有四个特性ACID,即原子性,一致性,隔离性和持续性,J2EE应用的事务处理
有两种:局部事务和全局事务,只涉及单一数据库资源时使用单阶段提交的局部事务即可,若应用程序需要访问和操作多个数据库资源时就需要采用分布式事务管理,分布式事务处理的关键
是把操作多个数据库的全部动作作为一个整体处理,要么全部提交,要么全部回滚,保证当业务逻辑跨跃多个数据库资源时保持多个数据库数据的一致性,
(1)原子性[Atomicity]--事务是应用中不可再分的最少逻辑执行体;
(2)一致性[Consistency]--事务的执行结果必须从数据库的一个一致性状态变成另一个一致性状态,一致性是通过原子性事保证的;
(3)隔离性[Isolation]--各个事务的执行互不干扰,任意一个事务内部的操作对其它并发的事务都是隔离且互不影响的;
(4)持续性(Durability)--也称持久性,事务一旦提交,对数据库所做的任何改变都将永久的保存到数据库中;
2.JTA--Java Transaction API提供了事务划分的标准接口,尤其当应用程序需要执行两个或多个需要依赖不同数据库的操作时,应用程序就需要JTA将这两个或多个操作包含成一个全局事务,
【JPA03】使用JTA允许应用程序跨跃多个事务性数据库且保证事务的一致性,主流应用服务器JBOSS,WEBLOGIC都支持全局事务JTA,布署到应用服务器中的应用程序无须理会事务管理代码而让应用
服务器管理事务,即容器管理事务;只要对建立在JTA之上的EJB会话Bean和MDB业务组件增加事务控制代码即可实现事务管理且有两种事务管理机制:CMT和BMT,CMT是声明式容器管理事务,BMT是在EJB内部使用
事务管理代码自己管理事务,即Bean管理事务,其中CMT更加简单易用且具有很好的移植性;
(1)XA规范--X/Open组织定义的分布式事务规范,其定义的分布式事务处理模型包括AP[应用程序],TM[事务管理器],RM[资源管理器],CRM[通信资源管理器]四部分,对应的相关中间件
是:TM中间件由应用服务器实现,RM是数据库,CRM是消息中间件,此规范最大的好处在于事务的完整性由事务中间件和数据库控制,应用程序只需关注业务逻辑的实现而无需
过多关心事务的完整性,目前大部分商业数据库如Oracl,SQLServer都支持XA规范,MYSQL不支持此规范;此规范的理论基础就是2PC二阶段提交(2 Phase Commit)协议,
此协议定义了单个事务管理器如何协调和管理一个或多个数据库的局部事务,大致分为5个步骤:
<1>应用程序面向事务管理器编程,调用事务管理器的提交方法;
<2>事务管理器通知参与全局事务的每个数据库,告之准备开始提交事务,第一阶段从现在开始;
<3>参与全局事务的各个数据库进行局部事务的预提交;
<4>事务管理器收集到各个数据库预提交的结果;
<5>第二阶段开始,事务管理器收集到所有参与全局事务的局部事务预提交的结果之后做出相应判断:若所有参与全局事务的局部事务预提交的结果都可以成功,事务管理器向
每个数据库都发送进行实际提交的命令;若任意一个数据库的局部事务预提交的结果失败了,事务管理器向每个数据库都发送进行实际回滚的命令,让所有数据库退回提交
之前的状态;
二阶段提交是必须的,但对数据库而言从开始到结束(提交或回滚)时间相对较长,在事务处理期间数据库使用的资源(如逻辑日志,各种锁)将一直处于锁定状态,直到事务结束
时才会释放,因此二阶段提交会占用更多的资源而带来一定的性能损失;当一个全局事务只涉及一个数据库时,可以将二阶段提交优化成单阶段提交,当应用程序通知事务管理
器提交事务时,事务管理器直接通知数据库提交事务,单阶段提交是二阶段提交的一个特例,WebLogic已实现了这种优化,WebLogic还提供了"记录上一个资源"和"仿真二阶
段提交"的技术实现非XA数据库的二阶段提交;
(2)DataSource--JDBC提供了连接和操作数据库的基本API,但实际实用中往往采用DataSource管理数据库连接,DataSource是一个接口,由应用服务器或开源数据源实现,应用服务器
管理的数据源是容器管理的数据源,也有开源数据源DBCP,C3P0等,客户端通过数据源获取数据库连接来操作数据库,数据源的管理有两种方式:程序管理的数据源BMT和
容器管理的数据源CMT,前者相对复杂且使用稍微繁琐,后者具有很好的全局性且简单易用,但需要服务器具有数据源管理功能且已完成数据源配置,这样客户端就能根据
数据源的JNDI名称获取已配置的数据源对象;
<1>配置WebLogic数据源--点击服务->JDBC->数据源->新建->打开新建页面填写新配置的数据源信息,在设置数据源的全局事务时注意:MySQL本身不支持全局事务,
在选中支持全局事务处理时还须选择一种实现全局事务的模拟机制;Oracle支持全局事务,就无须进行模拟;
<2>配置JBOSS数据源--使用JBOSS提供的模板配置[docs\examples\jca],注意必须手动增加相应的数据库驱动;
(3)CMT--EJB默认使用容器管理事务策略,容器会接管EJB的事务管理完成事务的开始,提交或回滚,容器总是在业务方法的开始和结束处标记事务边界,开发者无需编写任何事务控制代码,
【JPA01】只需通过注解或XML告知容器如何处理事务,使用容器管理事务时业务方法中不能调用任何可能与容器所设置事务边界相冲突的方法,如Connection.commit,setAutoCommit,
【JPA02_CMT】rollback;EJBContext.getUserTransaction;UserTransaction的任何方法;若希望Bean的方法抛异常时能够回滚事务,可以在捕获异常的处理代码中加入EJBContext.
setRollbackOnly方法即可;
(4)BMT--开发者在EJB的业务方法内部自己决定事务处理边界和决定使用JTA事务还是JDBC事务,手动控制JTA事务主要通过调用UserTransaction的方法实现,相比CMT而言更加灵活但
【JPA02_BMT】不如CMT简单易用;在EJB的Bean中获取UserTransaction对象有三种方法,A.依赖注入[@Resource];B.JNDI查找;C.通过EJBContext.getUserTransaction方法获取,
通常采用UserTransaction与EntityManager/DataSource相结合的方式实现操作多个数据库目的且必须手动调用UserTransaction的事务开始,提交和回滚方法管理全局
事务,UserTransaction的相关方法如下示:
begin()--在当前线程中开始一个新的事务;
commit()--在当前线程中结束事务;
rollback()--在当前线程中回滚事务,这会导致事务结束,此方法应用于BMT的事务回滚;
setRollbackOnly()--通知容器回滚当前事务,此方法应用于CMT的事务回滚;
setTransactionTimeout(int seconds)--修改当前线程中的事务的超时时长;
...全文
93 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZHOU西口 2013-06-03
  • 打赏
  • 举报
回复
可以发表为你的博客哟

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧