初识EJB

EntityManagerFactory相当于Hibernate中的SessionFactory对象,它里面有一个PersistenUnit就代表着一个EntityManagerFactory以及所包含的映射元数据,代表着一个数据库,如果有两个数据库,就可以在persistence.xml的配置文件中配置两个persistence-unit。EntityManager由EntityManagerFactory所创建,相当于Hibernate中的session,persistenceContext相当于session的一级缓存!由persistenceContext跟数据库进行打交道。

 

容器管理的EntityManager和应用管理的EntityManager,主要讲的是EntityManager由谁来管理,默认是由容器管理,因为你不知道什么时候创建他,什么时候销毁它,当然也不负责close,一切交给容器管理,其实SSH也是相当于容器管理,Spring相当于容器,session的创建销毁都是由容器管理,创建注入的是EntityManager;应用管理就是有我们自己管理,有我们去创建、销毁、关闭等!其实他就是使用EntityManagerFactory的注入,创建新的。 EntityManager与session是不同的,Spring注入的不是session对象,而是sessionFactory对象,而这里注入的却是相当于session的对象;ssh中不能直接注入session对象,因为session是线程不安全的。SSH管理是在同一个事务中同一个session对象,通过ThreadLocal来传递session对象;由于EJB中的EntityManager可能是不同的进程之间的,不可能通过线程来传递他,他管理的是PersistenceContext,他不是跟EntityManager绑定的,他是跟事务绑定的;两个EntityManager是不一样的,但他们会对应同一个PersistenceContext,这是在同一个事务中的,随着事务的传播而传播;一个请求可能跨域多个线程或进程,但他们是在同一个事务中进行传播的,换句来讲,PersistenceContext随着事务的传播而传播,而不是随着线程的传播而传播!

 

容器管理的PersistenceContext,其生命周期由PersistenceContextType来配置。对于程序本身来说,他对PersistenceContext的创建销毁一无所知,完全自动和透明。PersistenceContext随着JTA事务而传播。可以被限定为单个事务或者是扩展他的生存期跨越多个事务取决于PersistenceContextType的配置。 1、 Transation Scoped:由容器创建,随着Transation而传播,随着Transaction的完成而销毁 2、 Extended Scoped:用于Stateful Session Bean,跨域多个Transaction,随着Stateful Session Bean的销毁而销毁。要使用他就是跟要使用Stateful Session Bean使用的时机是一样的

 

应用管理的PersistenceContext 事务: 原子性:所有的操作要么都成功,要么都失败 一致性:事务不能违反完整性约束(比如虽然事务还未提交,但仍需遵守各种约束规则,这些规则是在事务提交之前而非在事务提交以后才生效!)比如有一个User,username是不能为空的,但是你一保存,事务还没提交,你这个username也是不能为空的 隔离性:一个事务的效果,不影响正在同时执行的其他事务。 持久性:一但事务成功完成,数据必须保证已经正确的持久化!比如:即使这时候突然掉电了,这个数据也已经存起来。

隔离性:一个事务的效果,不影响正在同时执行的其他事务,那么,不影响的程度如何? 这个由隔离级别来定义,标准的隔离级别有以下四种: 未提交读、提交读、可重复读、序列化 通过一些现象看隔离级别的效果: 脏读:一个事务 读取了 另一个事务尚未提交的修改,产生脏读。 不可重复读:同一查询在同一次事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。 幻读:同一查询在同一次事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻象读。

 

JDBC事务与JTA事务 JDBC事务只能支持一个数据库(单数据源),一般由数据库本身来执行提交或回滚操作(单阶段提交)。 而JTA可以分布式的事务(多数据源),因为他要支持多个数据源,提高了一个“事务处理监视器”(TPM)来管理和协调这些数据源之间的事务操作,它必须执行两阶段提交(2PC)协议: 准备阶段:TPM向所有RM(资源管理器,即数据库)确认状态,是否可以提交或者回滚 提交阶段:TPM确认提交之后,向所有RM发出提交指令(或回滚) TPM本身会维护事务日志,以保证持久性(灾难恢复等)

 

事务类型:JTA和RESOURCE_LOCAL 使用JTA来控制事务,利用容器提供的JTA事务管理器来管理事务 通过jndi lookup将TPM的UserTransaction操纵对象给拿过来,这个就是全局事务 使用RESOURCE_LOCAL来控制事务 脱离容器使用的事务

 

事务管理类型:CONTAINER和BEAN 容器管理事务:由容器自动创建、删除 TransactionManagermentType.Bean:由EJB本身来管理,自己保存、回滚 事务的传播特性:是有容器来管理的,一个EJB调用另一个EJB,要不要创建事务,是有容器所管理的,Not Support、Support、Required、Required New、Mandatory、Nerver等,使用TransactionAttribute注解事务传播特性,可以放在方法或类的前面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值