Posted on 2006-01-13 22:24
JDeodar 阅读(407)
评论(0) 编辑 收藏 所属分类:
J2EE
Tansation Management -- 事务管理
应用程序可以用于以下两种手段来管理容器事务,从而控制应用服务器的事务管理服务
1、编程式事务管理:使用JTA UserTransaction对象,通过JNDI获取
2、声明式事务管理:通过使用组建模型(即EJB CMT),这是一种建立在JTA基础设施之上的高层的服务
这两种方法通常都被命名为“受控的事务”(EJB CMT)。
容器管理事务(Container-Managed Transaction)
优点:把事务管理从Java代码中挪到了EJB部署描述符中。因此事务编程了一个无需硬编码的横切面。
缺点:
1、只有EJB才能够使用声明式事务管理
2、声明式事务实际上也符合80-20原则
3、EJB CMT必须使用全局事务管理,如果仅需要单事务的资源,大材小用。
Spring的声明式事务管理建立在Spring的AOP框架之上,所以Spring的事务管理需要带有AOP功能的Spring Bean工厂。
事物的传播类型:(6种)
1、“required”运行在当前的事务范围内,如果当前没有启动事务,那么创建一个新的事物
2、“supports”运行在当前的事务范围内,如果当前没有启动事务,那么就不在事务范围内执行
3、“mandatory”运行在当前的事务范围内,如果当前没有启动事务,那么抛出异常
4、“requires new”创建一个新的事务,如果当前启动了事务,那么挂起当前事务
5、“not supported”不在事务范围内执行,如果当前启动了事务,那么挂起当前事务
6、“never”不在事务范围内执行,如果当前启动了事物,那么抛出异常
默认的事务类型是“required”,适用于绝大多数的情况。
编程式事务管理通常有以下两种使用方式:一是通常的使用方式,在一个catch代码块中对任何异常进行回滚处理;二是通过一个“控制反转(IoC)”模版类和一个回调实现。
事物管理最适合使用AOP。
Spring的事务处理最重要的好处是,在不需要任何部署步骤和特定的需要的情况下,可以让POJO具备事务处理能力。
YAGNI(You Arent Gonna Need It,不要为不必要的需求埋单)
Persistence -- 持久化
Patterns of Enterprise Application Architecture(2002 Martin Fowler),常简称POEAA -- 一定要读
处理批量存取和批量更新时,O/R映射会有问题,不知道什么时候才能解决优化呢?
下面的征兆,可以考虑使用O/R映射:
1、针对领域对象的“加载/编辑/存储”流程,例如先加载一条产品记录,对其进行修改,然后更新会数据库。
2、对象以批量查询的方式取出,但更新和删除则是单独进行。
3、大量对象需要积极地缓存(通常出现在“读操作远多于写操作”的情况下,如web应用。)
4、在领域对象与数据库表/字段之间有一个相当自然的对应关系。
5、不需要对SQL进行特别的优化。
细粒度的领域模型不应该用重量级的EJB组件来建模,而应该用简单的Java对象——POJO(Plain Old Java Object)——来建模。
所有的持久化技术必然会涉及对资源的管理:
1、连接工厂
2、连接
DAO模式的用途是将“与持久化相关的代码”从业务逻辑中分离出来,换句话说,把业务流程和规则放在一边,与持久化相关的问题放在另一边。DAO模式需要一个DAO接口,以便将特定的数据访问实现细节隐藏起来。
使用Spring框架进行数据访问
1、Spring的bean工厂和应用上下文容器使得应用程序中的各种对象能够轻松地装配起来。
2、Spring有一个清晰的事务模型
3、Spring提供了一个通用的数据库访问异常体系。
4、对于各种持久化方式,Spring用形式统一的模版机制解决了关闭连接、处理异常等问题。
JdbcTemplate实例(以及别的Spring模版)都是线程安全的,允许多线程复用。因此只需要在DAO初始化将一个JdbcTemplate实例提供给它,所有的DAO方法都可以使用这同一个模版实例,不必担心任何同步问题。
Spring框架提供了另一个层次较高的JDBC抽象:可询操作、更新操作或是存储过程。