DAO编程学习
2004-11-02 16:40
232 查看
一.DAO基本原理
dao实现基本组件:
1.一个dao工厂类.
2.一个dao接口.
3.一个实现了dao接口的具体类(包含从数据源存取数据的逻辑).
4.一个数据传送对象(值对象).
二.事务分界线(Transaction demarcation)
DAOs are transactional objects.
事务是dao模式中重要的概念,dao的所有操作,比如增,删,更新操作都是建立在事务的基础之上.因此事务分界线的是个很重要的概念.
事务分界线有两种模型:programmatic and declarative
programmatic:程序员负责编码事务的逻辑,应用程序通过API来控制事务.
declarative:程序员使用ejb的部署描述符来声明事务属性,运行环境(ejb容器)使用此属性动态的管理事务.
设计时必须考虑的问题:
1.事务怎样开始.
2.事务怎样结束.
3.那个对象负责开始事务.
4.那个对象负责结束事务.
5.dao是否负责开始和结束事务.
6.应用是否需要跨越多个dao访问数据.
7.一个事务涉及到一个还是多个dao.
8.一个dao是否要调用另一个dao的方法.
DAO中两种主要的事务分界线策略:
1.DAO负责划分事务界限,在DAO类中嵌入事务代码.
2.调用DAO方法的对象负责划分事务界限,事务代码在DAO之外.特别适合一个事务需要访问多个dao的情况.比如以下代码:
tx.begin(); // start the transaction
dao.createWarehouseProfile(profile);
dao.updateWarehouseStatus(id1, status1);
dao.updateWarehouseStatus(id2, status2);
tx.commit(); // end the transaction
dao事务策略的实现主要是通过jdbc API或者是JTA ,jdbc实现比JTA实现简单,但没有JTA灵活
JDBC定界事务:
jdbc通过connection对象来控制事务,connection对象提供了两种模式来控制:自动提交和手工提交.
通过jdbc定界事务能在一个单独的事务中执行多条sql语句,但是不能横跨多个数据库,事务的作用范围被限制在一个数据库中.
import java.sql.*;
import javax.sql.*;
// ...
DataSource ds = obtainDataSource();
Connection conn = ds.getConnection();
conn.setAutoCommit(false);
// ...
pstmt = conn.prepareStatement("UPDATE MOVIES ...");
pstmt.setString(1, "The Great Escape");
pstmt.executeUpdate();
// ...
conn.commit();
// ...
JTA定界事务:
JTA和JTS为J2EE平台提供分布式事务服务,分布式事务包括一个事务管理和多个资源管理,下图展示了他们之间的关系.
一个JTA事务可以有多个参与者,以下的j2ee平台组件可以参与到JTA事务中出:
JDBC connections
JDO
JMS queues
JMS topics
Enterprise JavaBeans
A resource adapter that complies with the J2EE Connector Architecture specification
JTA提供的方法:
Sample:
import javax.transaction.*;
import javax.naming.*;
// ...LookUp JNDI
InitialContext ctx = new InitialContext();
Object txObj = ctx.lookup("java:comp/UserTransaction");
UserTransaction utx = (UserTransaction) txObj;
utx.begin();
// ...start transaction
DataSource ds = obtainXADataSource();
Connection conn = ds.getConnection();
pstmt = conn.prepareStatement("UPDATE MOVIES ...");
pstmt.setString(1, "Spinal Tap");
pstmt.executeUpdate();
// ...
utx.commit();
// ...
两种策略总结:
jdbc:Transaction demarcation code is embedded inside the DAO class.
The DAO class uses the JDBC API for transaction demarcation.
The caller has no way to demarcate the transaction.
Transaction scope is limited to a single JDBC Connection.
JTA:
Transactions are demarcated with JTA.
Transaction demarcation code is separated from the DAO.
The caller is responsible for demarcating the transaction.
The DAO participates in a global transaction
dao实现基本组件:
1.一个dao工厂类.
2.一个dao接口.
3.一个实现了dao接口的具体类(包含从数据源存取数据的逻辑).
4.一个数据传送对象(值对象).
二.事务分界线(Transaction demarcation)
DAOs are transactional objects.
事务是dao模式中重要的概念,dao的所有操作,比如增,删,更新操作都是建立在事务的基础之上.因此事务分界线的是个很重要的概念.
事务分界线有两种模型:programmatic and declarative
programmatic:程序员负责编码事务的逻辑,应用程序通过API来控制事务.
declarative:程序员使用ejb的部署描述符来声明事务属性,运行环境(ejb容器)使用此属性动态的管理事务.
设计时必须考虑的问题:
1.事务怎样开始.
2.事务怎样结束.
3.那个对象负责开始事务.
4.那个对象负责结束事务.
5.dao是否负责开始和结束事务.
6.应用是否需要跨越多个dao访问数据.
7.一个事务涉及到一个还是多个dao.
8.一个dao是否要调用另一个dao的方法.
DAO中两种主要的事务分界线策略:
1.DAO负责划分事务界限,在DAO类中嵌入事务代码.
2.调用DAO方法的对象负责划分事务界限,事务代码在DAO之外.特别适合一个事务需要访问多个dao的情况.比如以下代码:
tx.begin(); // start the transaction
dao.createWarehouseProfile(profile);
dao.updateWarehouseStatus(id1, status1);
dao.updateWarehouseStatus(id2, status2);
tx.commit(); // end the transaction
dao事务策略的实现主要是通过jdbc API或者是JTA ,jdbc实现比JTA实现简单,但没有JTA灵活
JDBC定界事务:
jdbc通过connection对象来控制事务,connection对象提供了两种模式来控制:自动提交和手工提交.
public void setAutoCommit(boolean)
public boolean getAutoCommit()
public void commit()
public void rollback()
通过jdbc定界事务能在一个单独的事务中执行多条sql语句,但是不能横跨多个数据库,事务的作用范围被限制在一个数据库中.
import java.sql.*;
import javax.sql.*;
// ...
DataSource ds = obtainDataSource();
Connection conn = ds.getConnection();
conn.setAutoCommit(false);
// ...
pstmt = conn.prepareStatement("UPDATE MOVIES ...");
pstmt.setString(1, "The Great Escape");
pstmt.executeUpdate();
// ...
conn.commit();
// ...
JTA定界事务:
JTA和JTS为J2EE平台提供分布式事务服务,分布式事务包括一个事务管理和多个资源管理,下图展示了他们之间的关系.
一个JTA事务可以有多个参与者,以下的j2ee平台组件可以参与到JTA事务中出:
JDBC connections
JDO
PersistenceManagerobjects
JMS queues
JMS topics
Enterprise JavaBeans
A resource adapter that complies with the J2EE Connector Architecture specification
JTA提供的方法:
public void begin()
public void commit()
public void rollback()
public int getStatus()
public void setRollbackOnly()
public void setTransactionTimeout(int)
Sample:
import javax.transaction.*;
import javax.naming.*;
// ...LookUp JNDI
InitialContext ctx = new InitialContext();
Object txObj = ctx.lookup("java:comp/UserTransaction");
UserTransaction utx = (UserTransaction) txObj;
utx.begin();
// ...start transaction
DataSource ds = obtainXADataSource();
Connection conn = ds.getConnection();
pstmt = conn.prepareStatement("UPDATE MOVIES ...");
pstmt.setString(1, "Spinal Tap");
pstmt.executeUpdate();
// ...
utx.commit();
// ...
两种策略总结:
jdbc:Transaction demarcation code is embedded inside the DAO class.
The DAO class uses the JDBC API for transaction demarcation.
The caller has no way to demarcate the transaction.
Transaction scope is limited to a single JDBC Connection.
JTA:
Transactions are demarcated with JTA.
Transaction demarcation code is separated from the DAO.
The caller is responsible for demarcating the transaction.
The DAO participates in a global transaction
相关文章推荐
- 高级 DAO 编程 -------学习编译更好的 DAO 的技巧
- CC++初学者编程教程(12) 基于rhel6.3的Oracle数据库学习环境搭建
- Java编程思想学习(五) 复用类
- JS DOM编程艺术——setAttribute—— JS学习笔记2015-7-7(第78天)
- 学习编程需要正面的激励
- 我们编程吧 之 python 学习手册0.75
- Mybatis学习记录(二)--Mybatis开发DAO方式
- C专家编程学习笔记
- JAVA学习笔记(五十二)- 开发DAO层的经典实现
- 多线程编程需要学习
- 2016实习的学习笔记VS2013-网络编程
- 【学习java编程思想】day_1面向对象程序设计的方法
- 学习J2ME编程需要掌握的七种技术
- GreenDao 3.0 学习笔记(一)
- python核心编程学习(第二章)
- Java 编程思想(第四版)学习笔记(3)操作符
- 学习linux编程的资源汇总
- 学习linux/unix编程方法的建议,学习Linux的四个步骤
- 编程学习中
- Python核心编程--学习笔记--7--字典和集合