Template模式

Java事务处理全解析(五)——Template模式

在本系列的上一篇文章中,我们讲到了使用TransactionManger和ConnectionHolder完成线程安全的事务管理,在本篇中,我们将在此基础上引入Template模式进行事务管理。

这是一个关于Java事务处理的系列文章,请通过以下方式下载github源代码:

gitclonehttps://github.com/davenkin/java_transaction_workshop.git

Template模式大家应该都很熟悉,比如Spring就提供了许多Template,像JdbcTemplate和JmsTemplate等。Template模式的基本思想是:在超类里将完成核心功能的方法声明为抽象方法,留给子类去实现,而在超类中完成一些通用操作,比如JMS的Session的建立和数据库事务的准备工作等。

在本篇文章中,我们使用一个Template类来帮助管理事务,定义TransactionTemplate类如下:

packagedavenkin.step4_transaction_template;

importdavenkin.step3_connection_holder.TransactionManager;

importjavax.sql.DataSource;

publicabstractclassTransactionTemplate

{

privateTransactionManagertransactionManager;

protectedTransactionTemplate(DataSourcedataSource)

{

transactionManager=newTransactionManager(dataSource);

}

publicvoiddoJobInTransaction()

{

try

{

transactionManager.start();

doJob();

transactionManager.commit();

}catch(Exceptione)

{

transactionManager.rollback();

}finally

{

transactionManager.close();

}

}

protectedabstractvoiddoJob()throwsException;

}

在TransactionTemplate类中定义一个doJobInTransaction方法,在该方法中首先使用TransactionManager开始事务,然后调用doJob方法完成业务功能,doJob方法为抽象方法,完成业务功能的子类应该实现该方法,最后,根据doJob方法执行是否成功决定commit事务或是rollback事务。

然后定义使用TransactionTemplate的TransactionTemplateBankService:

packagedavenkin.step4_transaction_template;

importdavenkin.BankService;

importdavenkin.step3_connection_holder.ConnectionHolderBankDao;

importdavenkin.step3_connection_holder.ConnectionHolderInsuranceDao;

importjavax.sql.DataSource;

publicclassTransactionTemplateBankServiceimplementsBankService

{

privateDataSourcedataSource;

privateConnectionHolderBankDaoconnectionHolderBankDao;

privateConnectionHolderInsuranceDaoconnectionHolderInsuranceDao;

publicTransactionTemplateBankService(DataSourcedataSource)

{

this.dataSource=dataSource;

connectionHolderBankDao=newConnectionHolderBankDao(dataSource);

connectionHolderInsuranceDao=newConnectionHolderInsuranceDao(dataSource);

}

publicvoidtransfer(finalintfromId,finalinttoId,finalintamount)

{

newTransactionTemplate(dataSource)

{

@Override

protectedvoiddoJob()throwsException

{

connectionHolderBankDao.withdraw(fromId,amount);

connectionHolderInsuranceDao.deposit(toId,amount);

}

}.doJobInTransaction();

}

}

在TransactionTemplateBankService的transfer方法中,我们创建了一个匿名的TtransactionTemplate类,并且实现了doJob方法,在doJob方法中调用两个DAO完成业务操作,然后调用调用TransactionTemplateBankService的doJobInTransaction方法。

由于TransactionTemplate只是对上一篇文章中事务处理的一层封装,故TransactionManager和两个DAO类都保持和上一篇中的一样,此时他们都使用SingleThreadConnectionHolder获得Connection,故事务处理成功。

相关推荐