struts1.3.8 + Hibernate 事务处理,这样处理合适吗?

半途进入一个项目,大体情况是这样的:struts1.3.8 + Hibernate3,
Struts Action 直接调用 Hibernate DAO,

由于项目刚开始的时候没有把握好,开发人员把事务的处理放在了DAO层,导致系统出现莫名其妙的问题,

现在的改造是这样的。
1.把DAO中所有事务处理相关的代码去掉,包括关闭hibernate session 的代码。

2.由于Action太多,当初的开发人员也找不回来了,如果在所有的Action中添加事务处理的代码的话,粒度和位置都不好控制。于是做了一个统一处理所有Action中事务的尝试,大体思路如下:

扩展struts 的 RequestProcessor类,重写processActionPerform方法在Action执行前启动事务,执行成功后提交事务,执行中发生异常回滚事务,代码片段如下:

@Override
protected ActionForward processActionPerform(HttpServletRequest request,
HttpServletResponse response, Action action, ActionForm form, ActionMapping mapping)
throws IOException, ServletException {
Transaction tx = HibernateSessionFactory.getSession().beginTransaction();
ActionForward forward = null;
try {
log.info("begin transaction in HibernateSessionRequestProcessor");
log.info("before action execute");
forward = super.processActionPerform(request, response, action, form, mapping);
log.info("after action execute");
tx.commit();

} catch (Exception e) {
tx.rollback();
log.info("exception rollback transaction HibernateSessionRequestProcessor");
request.setAttribute("error", "执行出现错误了");
return mapping.findForward("error");
} finally {
HibernateSessionFactory.closeSession();
log.info("close session in HibernateSessionRequestProcessor");
}
return forward;
}


从现在测试的情况来看,有好使的地方,有不好使的地方。好使的地方是能够较好控制Action中的事务,不好使的地方是:如果Action执行过程中挂起了,事务没有正常提交或回滚,就会锁表。
还有这样做的一个不合理之处就是事务处理的粒度太大,Action 中所有的DAO 操作都控制在一个事务中了。

3. 由于一些JSP中直接调用DAO,按照网上的写法写了个Filter 处理所有的jsp中的事务和hibernate session的关闭。

4. 之前按照网上的OpenSession in view 的办法来处理事务,经常出现锁表的情况,所以琢磨出上述的做法,参考了很多资料,没有发现一个直接的做法。

请高手们给个思路,欢迎拍砖。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值