- 浏览: 1011488 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (367)
- JavaScript (23)
- Java (60)
- Python (41)
- 其他 (36)
- SQL (4)
- 开发工具 (26)
- Linux (15)
- AJAX (6)
- Cache (3)
- 正则 (4)
- 架构 (9)
- 手机 (3)
- MySQL (4)
- Android (115)
- vps (1)
- 网站 (4)
- scale (3)
- 搜索引擎 (3)
- iPhone (2)
- hessian (1)
- hessdroid (1)
- 411 (1)
- jstat (1)
- gc (1)
- gallery (1)
- 惯性 (1)
- eclipse (1)
- mac wget error (1)
- miui file explorer 无用 解决办法 (1)
- vim (1)
最新评论
-
qingyezhangluo:
哎。楼主您既然是分享代码的为什么要加密的呢?而且问你密码还不回 ...
android应用换皮肤(转) -
MagicError:
kavoe 写道下载文件有密码。。。。
http抓包工具 -
knightdf:
我先试下再来
JAVA的RAS加密例子 -
kavoe:
下载文件有密码。。。。
http抓包工具 -
changanfounder:
hmc1985 写道setCallbackDuringFlin ...
android gallery滑动惯性问题
ibatis DAO 框架提供了事务管理模块。而这个事务管理可以应用到很多场合,包括JDBC、Hibernate、JTA、SQLMAP等。
下面以最简单的JDBC来分析一下其如何实现事务管理。
首先来看一段代码:
public class OrderService { private DaoManager daoManager; private OrderDao orderDao; public OrderService() { daoManager = DaoConfig.getDaoManager(); orderDao = (OrderDao) daoManager.getDao(OrderDao.class); } public void method() { try { // a separate transaction orderDao.method1(); //第一个事务 daoManager.startTransaction(); //开始第二个事务 orderDao.method1(); orderDao.method2(); daoManager.commitTransaction();//提交第二个事务 } finally { daoManager.endTransaction(); } } }
在method()方法里有着两个事务,如果在方法里不显式的调用daoManager.startTransaction(),则每个DAO的一次方法调用就是一个独立的事务。
ibatis DAO事务,有两个核心接口DaoTransactionManager和DaoTransaction
对应着不同的数据库持久层实现,两个接口分别对应着不同实现
查看ibatis 代码,可以发现这些manager实现事务,就是调用事务源的事务操作方法
JdbcDaoTransactionManager
public void commitTransaction(DaoTransaction trans) { ((JdbcDaoTransaction) trans).commit(); }
JdbcDaoTransaction
public JdbcDaoTransaction(DataSource dataSource) { try { connection = dataSource.getConnection(); if (connection == null) { throw new DaoException("Could not start transaction. Cause: The DataSource returned a null connection."); } if (connection.getAutoCommit()) { connection.setAutoCommit(false); } if (connectionLog.isDebugEnabled()) { connection = ConnectionLogProxy.newInstance(connection); } } catch (SQLException e) { throw new DaoException("Error starting JDBC transaction. Cause: " + e); } } public void commit() { try { try { connection.commit(); } finally { connection.close(); } } catch (SQLException e) { throw new DaoException("Error committing JDBC transaction. Cause: " + e); } }
那么DaoTransactionManager以什么依据处理事务呢?DaoTransactionState看看DaoTransactionState的代码,非常简单,四个常量来表示事务处于的不同的状态
public static final DaoTransactionState ACTIVE = new DaoTransactionState(); public static final DaoTransactionState INACTIVE = new DaoTransactionState(); public static final DaoTransactionState COMMITTED = new DaoTransactionState(); public static final DaoTransactionState ROLLEDBACK = new DaoTransactionState();
那么实际程序中是如何控制事务的呢
在第一段代码中,我们是这样取得DAO
orderDao = (OrderDao) daoManager.getDao(OrderDao.class);
实际daoManager返回的并不是orderDao的具体实现类,它返回的DaoProxy
DaoProxy
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; if (PASSTHROUGH_METHODS.contains(method.getName())) { try { result = method.invoke(daoImpl.getDaoInstance(), args); } catch (Throwable t) { throw ClassInfo.unwrapThrowable(t); } } else { StandardDaoManager daoManager = daoImpl.getDaoManager(); DaoContext context = daoImpl.getDaoContext(); if (daoManager.isExplicitTransaction()) { // Just start the transaction (explicit) try { context.startTransaction(); result = method.invoke(daoImpl.getDaoInstance(), args); } catch (Throwable t) { throw ClassInfo.unwrapThrowable(t); } } else { // Start, commit and end the transaction (autocommit) try { context.startTransaction(); result = method.invoke(daoImpl.getDaoInstance(), args); context.commitTransaction(); } catch (Throwable t) { throw ClassInfo.unwrapThrowable(t); } finally { context.endTransaction(); } } } return result; }
看到这段代码就非常清楚了,每调用DAO的一次方法时,如果不显式的调用daoManager.startTransaction(),就会成为单独的一个事务。再看看ibatis为我们提供的摸板JdbcDaoTemplate
protected Connection getConnection() { DaoTransaction trans = daoManager.getTransaction(this); if (!(trans instanceof ConnectionDaoTransaction)) { throw new DaoException("The DAO manager of type " + daoManager.getClass().getName() + " cannot supply a JDBC Connection for this template, and is therefore not" + "supported by JdbcDaoTemplate."); } return ((ConnectionDaoTransaction) trans).getConnection(); }
ibatis控制多个DAO的事务实际是让这些DAO共用了一个DaoTransaction(ThreadLocal),一个Connection
这里是一个事务源的情况,如果多个事务源之间要完成全局事务,还是老老实实用分布式事务管理服务吧(jta)
发表评论
-
android屏幕适配
2012-11-16 17:24 2195屏幕适配一直是一个让人头疼的问题,论坛上讨论这个问题的最后也 ... -
禁止Eclipse中xml文件Run as的XSL Transformation生成out.xml以方便Android应用开发
2012-08-26 21:38 2642可以在Eclipse里面配置,菜单Windows->P ... -
android 自带的主题 theme 的使用
2012-08-25 23:21 2373在android的sdk 安装目录data\r ... -
android开发之gallery 实现滚动一张且短距离滑动实现滚动
2011-12-19 18:50 1930首先gallery的特点就不用多说了吧,惯性滚动、半屏翻页,但 ... -
使用Jstat监控gc情况(收藏)
2011-12-19 13:22 1860性能测试过程中,我们 ... -
eclipse生成javadoc乱码解决
2011-10-24 09:37 1292eclipse在生成javadoc的时候出现乱码,是因为 ... -
java中在静态方法或变量中动态获取当前类的类名
2011-10-14 11:20 3704java中在静态方法中动态获取当前类的类名或者动态获取当前类的 ... -
飞鸽传书实现原理
2011-10-13 11:35 3261飞鸽传书的实现原理: (1)最关键的是局域网用户列表的 ... -
Android开发——利用Cursor+CursorAdapter实现界面实时更新(转)
2011-09-20 15:47 3085好久没有更新博客了 ... -
Nginx使用反向代理时 Hessian 的 411 错误解决方案【转】
2011-09-15 13:48 2363问题描述: 用 Hessian 实现 web se ... -
"Copy" did not complete normally. Please see the log for more information.
2011-05-06 17:19 4041在用android日志的时候老是弹出一个窗口,内容 ... -
jdk api下载地址备份
2011-02-15 10:58 1587中文jdk6的api: JDK6 API 中文版 H ... -
JAVA NIO 简介(转)
2010-12-09 13:03 1064http://www.iteye.com/topic/8344 ... -
netty的资料
2010-10-31 16:06 1291http://hornetq.sourceforge.net/ ... -
Java程序发邮件小例子(转载收藏)
2010-10-27 21:25 1563今天试了一个Java写的发邮件小例子,需要的jar包有 ... -
使用Netty 构造一个异步的httpclient
2010-09-21 00:35 7840原文地址:http://dev.firnow.com/co ... -
Netty使用初步
2010-09-21 00:26 13972收藏自:http://www.kafk ... -
集群环境下SESSION处理(转)
2010-09-08 15:24 1847本文转自:http://blog.csdn.net/l ... -
Java集合的Stack、Queue、Map的遍历
2010-09-08 13:00 1442在集合操作中,常常 ... -
<转>,防止刷新/后退引起的重复提交问题的Java Token代码,非Struts
2009-12-10 13:31 1918贴子转自http://hi.baidu.com/bobylou ...
相关推荐
iBATIS DAO是Java开发中的一个持久层框架,它提供了数据访问对象(DAO)的实现,使得数据库操作更加简单和灵活。在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好...
此外,事务管理也是`IBATISDAO`库类中重要的一部分。在执行一系列数据库操作时,可以通过`SqlMapClientTransactionManager`来控制事务的开启、提交和回滚,保证数据的一致性。 **5. 扩展性和性能优化** `IBATISDAO...
本资料“ibatisDao.rar”包含了一份对iBATIS DAO框架的深入分析,旨在帮助开发者更好地理解和应用这一技术。 在iBATIS中,DAO(Data Access Object)是数据库访问对象,它封装了对数据库的增删查改操作。DAO模式是...
iBATIS DAO 2.2.0.638是一个特定版本的iBATIS框架,这个版本提供了对数据库操作的灵活支持,简化了SQL与Java代码的集成,使开发者能够更高效地处理数据库事务。 iBATIS的核心理念是将SQL语句直接写在XML配置文件中...
首先,Ibatis的配置文件(通常为`SqlMapConfig.xml`)是整个框架的入口,它包含了数据源配置、事务管理器和其他全局设置。在这个文件中,你可以定义多个数据源,每个数据源对应一个`<transactionManager>`和`...
在IT领域,尤其是在Java开发中,iBATIS与DAO(Data Access Object)模式的结合为开发者提供了一种高效、灵活且可扩展的数据访问方案。本文将深入探讨iBATIS实现DAO的相关知识点,包括其背景、原理、优势以及具体实现...
结合Ibatis,我们可以创建一个Action类,注入Service,Service再注入Dao,其中Dao使用Ibatis的SqlSession进行数据库操作。Struts2的拦截器可以与Spring的AOP配合,实现如权限控制等功能。在配置文件中,需要配置...
本文将引导读者逐步将一个使用SQL Maps的应用转换为基于iBatis DAO框架的应用,并讨论DAO框架的构建、事务管理以及如何自定义事务管理模块。通过这个过程,读者可以深入理解iBatis DAO如何简化数据访问层的开发,...
在`IBatisDao`中,通常会有一个事务管理类来包裹这些操作,确保数据的一致性。 6. **缓存支持**:`IBatis`提供了本地缓存和二级缓存机制,可以提高数据读取效率。在`IBatisDao`中,可能有开启和关闭缓存的配置。 7...
5. **iBatis-dao-2.jar**:iBatis(在本例中可能是iBATIS DAO的特定版本)是另一种ORM框架,不同于Hibernate,它更强调SQL的灵活性。iBatis允许开发者编写自定义的SQL,将SQL语句直接嵌入XML配置文件或Java代码中,...
这个压缩包包含了Ibatis的三个关键组件:common、dao和sqlmap,它们各自扮演着不同的角色,共同构成了Ibatis框架的核心功能。 1. **Ibatis-common**: Ibatis-common 包含了Ibatis框架的基础工具类和通用模块,...
3. **事务管理**:iBATIS支持事务的自动提交和回滚,可以根据不同的数据库配置进行事务控制。 4. **结果映射**:iBATIS能将查询结果自动映射到Java对象,减少了手动转换的工作量。 5. **动态SQL**:通过iBATIS的...
- **Dao 事务管理**: iBATIS 提供了多种事务管理器实现,如 JtaDaoTransactionManager、JdbcDaoTransactionManager 等,用于处理不同类型的事务逻辑。 ##### 2.2 iBATIS DAO 架构设计 iBATIS 的 DAO 层采用了 ...
4. **实现DAO接口**:虽然Ibatis使用动态代理自动实现了DAO接口,但我们还需要提供一个接口实现类,以便在需要的时候进行事务控制。 5. **编写Service逻辑**:在业务层,我们收集要插入的数据到List中,然后调用DAO...
Ibatis官方资料大全提供了全面的学习资源,包括ibatis-common.jar、ibatis-Dao.jar和ibatis-sqlmap.jar等核心组件的详细讲解和相关jar文件,是学习和使用Ibatis不可或缺的参考资料。 首先,我们来了解一下ibatis-...
这个教程将带你逐步了解如何设置iBATIS环境,创建数据库连接,编写和测试SQL Maps,以及处理事务管理。它可能是初学者入门iBATIS的绝佳资源,因为它以中文呈现,使得国内开发者更容易理解。 总的来说,这些文档覆盖...
Ibatis的配置文件`sqlmapConfig.xml`包含了数据源、事务管理器、SqlSessionFactory等核心设置。在Java代码中,可以使用如下的方式加载配置文件: ```java String resource = ...
4. **事务管理**:DAO层通常负责事务的开启、提交和回滚。在iBATIS中,可以通过配置或者编程方式来管理事务,确保数据的一致性。 5. **接口驱动编程**:iBATIS鼓励使用接口驱动的编程模型,开发者定义DAO接口,然后...