Java事务处理全解析(五)—— Template模式
来源:互联网 发布:java初始化的局部变量 编辑:程序博客网 时间:2024/06/10 09:35
在本系列的上一篇文章中,我们讲到了使用TransactionManger和ConnectionHolder完成线程安全的事务管理,在本篇中,我们将在此基础上引入Template模式进行事务管理。
这是一个关于Java事务处理的系列文章,请通过以下方式下载github源代码:
Git clone https://github.com/davenkin/java_transaction_workshop.git
Template模式大家应该都很熟悉,比如spring就提供了许多Template,像JdbcTemplate和JmsTemplate等。Template模式的基本思想是:在超类里将完成核心功能的方法声明为抽象方法,留给子类去实现,而在超类中完成一些通用操作,比如JMS的Session的建立和数据库事务的准备工作等。
在本篇文章中,我们使用一个Template类来帮助管理事务,定义TransactionTemplate类如下:
- public abstract class TransactionTemplate
- {
- private TransactionManager transactionManager;
- protected TransactionTemplate(DataSource dataSource)
- {
- transactionManager = new TransactionManager(dataSource);
- }
- public void doJobInTransaction()
- {
- try
- {
- transactionManager.start();
- doJob();
- transactionManager.commit();
- } catch (Exception e)
- {
- transactionManager.rollback();
- } finally
- {
- transactionManager.close();
- }
- }
- protected abstract void doJob() throws Exception;
- }
public abstract class TransactionTemplate{ private TransactionManager transactionManager; protected TransactionTemplate(DataSource dataSource) { transactionManager = new TransactionManager(dataSource); } public void doJobInTransaction() { try { transactionManager.start(); doJob(); transactionManager.commit(); } catch (Exception e) { transactionManager.rollback(); } finally { transactionManager.close(); } } protected abstract void doJob() throws Exception;}
在TransactionTemplate类中定义一个doJobInTransaction方法,在该方法中首先使用TransactionManager开始事务,然后调用doJob方法完成业务功能,doJob方法为抽象方法,完成业务功能的子类应该实现该方法,最后,根据doJob方法执行是否成功决定commit事务或是rollback事务。
- public class TransactionTemplateBankService implements BankService
- {
- private DataSource dataSource;
- private ConnectionHolderBankDao connectionHolderBankDao;
- private ConnectionHolderInsuranceDao connectionHolderInsuranceDao;
- public TransactionTemplateBankService(DataSource dataSource)
- {
- this.dataSource = dataSource;
- connectionHolderBankDao = new ConnectionHolderBankDao(dataSource);
- connectionHolderInsuranceDao = new ConnectionHolderInsuranceDao(dataSource);
- }
- public void transfer(final int fromId, final int toId, final int amount)
- {
- new TransactionTemplate(dataSource)
- {
- @Override
- protected void doJob() throws Exception
- {
- connectionHolderBankDao.withdraw(fromId, amount);
- connectionHolderInsuranceDao.deposit(toId, amount);
- }
- }.doJobInTransaction();
- }
- }
public class TransactionTemplateBankService implements BankService{ private DataSource dataSource; private ConnectionHolderBankDao connectionHolderBankDao; private ConnectionHolderInsuranceDao connectionHolderInsuranceDao; public TransactionTemplateBankService(DataSource dataSource) { this.dataSource = dataSource; connectionHolderBankDao = new ConnectionHolderBankDao(dataSource); connectionHolderInsuranceDao = new ConnectionHolderInsuranceDao(dataSource); } public void transfer(final int fromId, final int toId, final int amount) { new TransactionTemplate(dataSource) { @Override protected void doJob() throws Exception { connectionHolderBankDao.withdraw(fromId, amount); connectionHolderInsuranceDao.deposit(toId, amount); } }.doJobInTransaction(); }}
在TransactionTemplateBankService的transfer方法中,我们创建了一个匿名的TtransactionTemplate类,并且实现了doJob方法,在doJob方法中调用两个DAO完成业务操作,然后调用调用TransactionTemplateBankService的doJobInTransaction方法。
由于TransactionTemplate只是对上一篇文章中事务处理的一层封装,故TransactionManager和两个DAO类都保持和上一篇中的一样,此时他们都使用SingleThreadConnectionHolder获得Connection,故事务处理成功。
在下一篇文章中,我们会讲到使用Java的动态代理来完成事务处理,这也是Spring管理事务的典型方法。
- Java事务处理全解析(五)—— Template模式
- Java事务处理全解析(五)—— Template模式
- Java事务处理全解析(五)—— Template模式
- Java事务处理全解析(五)—— Template模式
- Java事务处理全解析(五)—— Template模式
- java事务全解析(五)--Template模式
- Java事务处理全解析(一)——Java事务处理的基本问题
- java事务处理全解析
- java事务处理全解析
- java事务处理全解析
- java事务处理全解析
- java事务处理全解析(一)
- java事务处理全解析(一)
- Java事务处理全解析(一)——Java事务处理的基本问题
- Java事务处理全解析(六)—— 使用动态代理(Dynamic Proxy)完成事务
- Java事务处理全解析(六)—— 使用动态代理(Dynamic Proxy)完成事务
- Java事务处理全解析(六)—— 使用动态代理(Dynamic Proxy)完成事务
- Java事务处理全解析(六)—— 使用动态代理(Dynamic Proxy)完成事务
- int main() 与 void main()
- Java事务处理全解析(四)—— 成功的案例(自己实现一个线程安全的TransactionManager)
- MapReduce之WordCount
- 《java设计模式》:java内置观察者模式
- KMP
- Java事务处理全解析(五)—— Template模式
- 数据库知识点---事务
- Homebrew安装简介
- HDU 3068 最长回文
- 计算机图形学-实验5-掌握Bezier样条曲面生成思想、复习基本图元绘制、交互操作和几何变换相关内容
- SDIO驱动(4)sdio总线上driver和设备的match
- 常用命令
- 部署Servlet(一)——Servlet2.X
- excel vba 身份证校验