Spring学习笔记(3)

线程加载jdbc连接,实现spring方法的线程安全,主要代码有三个部分:

线程连接类:获取本地线程,将数据库的连接池加入线程,这样就能保证spring容器里获取的连接都是本地线程中的唯一的连接

//线程连接
@Component("threadConnection")
public class ThreadConnectionUtil {

   
public ThreadLocal<Connection> t = new ThreadLocal<Connection>();
 @Autowired
 
private DataSource dataSource;
  
public Connection getConnection() { //获取当前线程中本地数据库的连接 try { Connection connection = t.get(); if(connection==null) { //从连接池中获取连接 connection = dataSource.getConnection(); t.set(connection); } return connection; } catch (SQLException e) { throw new RuntimeException(e); } } }

事务管理工具类,从线程中获取连接后,调用连接的事务方法,开启事务时要记得关闭自动提交!

//事务管理
@Component("transcationManage")
public class TranscationManageUtil {
    
    @Autowired
    private ThreadConnectionUtil threadConnection;

    //开启事务
    public void beginTranscation() {
        try {
       // 关闭自动提交! threadConnection.getConnection().setAutoCommit(
false); } catch (SQLException e) { e.printStackTrace(); } } //提交事务 public void commit() { try { threadConnection.getConnection().commit(); } catch (SQLException e) { e.printStackTrace(); } } //回滚事物 public void rollback() { try { threadConnection.getConnection().rollback(); } catch (SQLException e) { e.printStackTrace(); } } //关闭 public void close() { try { threadConnection.getConnection().close(); } catch (SQLException e) { e.printStackTrace(); } } }

在service方法中,控制管理事务,检测到异常时进行回滚,这样就不会出现因为异常导致的错误的数据更改,因此是线程安全的

@Service("accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;
    @Autowired
    private TranscationManageUtil transcationManage;

    public void update(account) {
        try {
            //开始事务
            transcationManage.beginTranscation();
            
            // 更新数据
            accountDao.updateAccount(account);

            //提交事务
            transcationManage.commit();
        } catch (Exception e) {
            //回滚
            transcationManage.rollback();
            e.printStackTrace();
        } finally {
            //释放资源
            transcationManage.close();
        }
    }

}

这一部分是学习aop框架的前置部分,明白事务的控制对接下来学习会有很大帮助

猜你喜欢

转载自www.cnblogs.com/HJYDR/p/12358557.html