非常经典的现实例子。
其实这也就是为什么要使用AOP的缘故,在目前解决方案中,AOP可以漂亮地解决这个问题。
下面以AspectJ为例子,当然使用其他AOP如Spring或JBoss 3.0更简单,JBoss 3.0相当于使用EJB,缺省支持,无需Spring那样专门配置事务语句。
你的DAO代码写成如下:
ADAO{ methodA(){ Connection con=ConnectionPool.getConnection(); //do methodA thing methodB2(con); con.close(); } methodB(){ Connection con=ConnectionPool.getConnection(); methodB(con); con.close(); } methodB(Connection con){//do methodB thing} }
|
public aspect Lock {
......
Connection con;
public pointcut writeOperations():
execution(public boolean ADAO.methodA()) ||
execution(public boolean ADAO.methodB()) ) ;
before() : writeOperations() {
//开始事务机制 advice body
con=ConnectionPool.getConnection();
}
after() : writeOperations() {
//结束事务
con.close();
}
......
}
在不使用AOP情况下,你的第三个方案是比较合理的,建议将
methodB(Connection con){//do methodB thing}和mehtodA中主要业务逻辑单独打包成一个类。