线程加载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框架的前置部分,明白事务的控制对接下来学习会有很大帮助