Java中通过ThreadLocal实现线程绑定来传递参数

ThreadLocal的基本理解
Threadlocal很多地方都叫线程本地变量,也有很多地方叫线程本地存储,个人理解在业务上方法调用方法时都是在单线程中进行操作,在进行访问数据库时牵扯到事务操作时,因为要求要做到事务的start transaction()和commit()操作都需要同一个connection来执行,而恰巧我们的connection是从线程池中调用的。因此,我们不能保证我们进行事务开启和提交时都是用的相同的connection对象,在MVC三层架构中,一个层的方法调用另一个层的方法,难免会产生错误,比如数据库的脏读、不一致读等等,因此这里有两个解决办法。

①将connection对象作为参数传递给方法,这样就可以保证每次调用的connection对象都是一致的,但是个人觉得,这样就违背了面向对象的封装理念,同时代码也显得很臃肿,下面给出另一种解决办法,也就是用到了我们的ThreadLocal。

②private static ThreadLocal tl = new ThreadLocal(); ThreadLoacl是一个类似Map的数据结构,key是当前的线程名称,value是当前的connection对象。由于ThreadLocal本身实现了自动封装,因为当前线程名称是固定的,所以对应的一个key仅有一个connection对象与之对应。 我们创建一个connection集合,因为我们在一次方法之间的调用时,是单线程工作,我们将数据库事务的开启、提交、终止等操作都封装到工具类中,由工类负责事务的开启等。每次进行事务操作时,都从本地的ThreadLocal中寻connection对象,这样一来就可以保证每次进行数据库读写操作时,都是固定的一个connection对象。

public static void startTransaction() throws SQLException {
        Connection currentonnection = getCurrentonnection();
        currentonnection.setAutoCommit(false);
    }

    // 获得当前线程上绑定的conn
    public static Connection getCurrentonnection() throws SQLException {
        // 从TheradLocal寻找当前线程是否有对应Connection
        Connection connection = tl.get();
        if (connection == null) {
            // 获得一个新的connection资源
            connection = getConnection();
            // 讲connection资源绑定到threadlocal(map)上
            tl.set(connection);
        }
        return connection;
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    // 回滚事务
    public static void rollback() throws SQLException {
        // TODO Auto-generated method stub
        getCurrentonnection().rollback();
    }

    public static void commit() throws SQLException {
        // TODO Auto-generated method stub
        Connection currentonnection = getCurrentonnection();
        currentonnection.commit();
        tl.remove();
        currentonnection.close();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值