使用Filter与ThreadLocal组合管理事务

ThreadLocal存储数据库Connection连接对象

为了保证事务的一致性,我们要使用数据库事务管理操作。
回顾一下jdbc的事务管理:

Connection conn = JDBCUtils.getConnection();

try{
	//取消自动提交事务,手动提交
	conn.setAutoCommit(false);
	//... ...
	//执行了 一系列jdbc操作
	//... ...
	//手动提交事务
	conn.commit();
}catch(Exception e){
	//出错了之后 事务回滚
	conn.rollback();
}finally{
	JDBCUtils.close(conn);
}

我们某一次操作可能需要经过一系列的数据库操作。这都是在一次线程中完成的。这一次线程操作中我们需要多次用到同一个Connection对象,故我们借助TheadLocal来存储这一对象。

注意:Dao中的单次操作或者这一次完整的事务操作过程中,不要将connection关闭,也不要去捕获异常。

原因:
  • connection关闭后无法控制事务中所有数据库在同一个connection中进行。
  • 捕获了异常后,调用Dao方法或其他方法的上层不知道哪一个地方出现了问题,无法进行有效的事务回滚。

使用Filter过滤器统一给所有的service方法都加上try-catch,来进行实现的管理

这个Filter可以对所有需要进行事务管理的最上层进行"拦截"(其实这是利用filter对进行方法加工)

@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        try {
            //方法放行
            filterChain.doFilter(servletRequest, servletResponse);
            JDBCUtils.commitAndClose();
        } catch (Exception e) {
            e.printStackTrace();
            JDBCUtils.rollbackAndClose();
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值