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();
}
}