Spring的Dao Service采用单例模式+ThreadLoca模式实现线程安全

在使用Spring时,很多人可能对Spring中为什么DAO和Service对象采用单实例方式很迷惑,这些读者是这么认为的:

    DAO对象必须包含一个数据库的连接Connection,而这个Connection不是线程安全的,所以每个DAO都要包含一个不同的Connection对象实例,这样一来DAO对象就不能是单实例的了。

    上述观点对了一半。对的是“每个DAO都要包含一个不同的Connection对象实例”这句话,错的是“DAO对象就不能是单实例”。

    其实Spring在实现Service和DAO对象时,使用了ThreadLocal这个类,这个是一切的核心! 

Spring使用ThreadLocal解决线程安全问题:

    Spring中DAO和Service都是以单实例的bean形式存在,Spring通过ThreadLocal类将有状态的变量(例如数据库连接Connection)本地线程化,从而做到多线程状况下的安全。在一次请求响应的处理线程中, 该线程贯通展示、服务、数据持久化三层,通过ThreadLocal使得所有关联的对象引用到的都是同一个变量。 

    参考下面代码

  1. public class SqlConnection {    
  2.     //①使用ThreadLocal保存Connection变量    
  3.     privatestatic ThreadLocal <Connection>connThreadLocal = newThreadLocal<Connection>();    
  4.     publicstatic Connection getConnection() {    
  5.        // ②如果connThreadLocal没有本线程对应的Connection创建一个新的Connection,    
  6.        // 并将其保存到线程本地变量中。    
  7.        if (connThreadLocal.get() == null) {    
  8.            Connection conn = getConnection();    
  9.            connThreadLocal.set(conn);    
  10.            return conn;    
  11.        } else {    
  12.            return connThreadLocal.get();    
  13.            // ③直接返回线程本地变量    
  14.        }    
  15.     }    
  16.     public voidaddTopic() {    
  17.        // ④从ThreadLocal中获取线程对应的Connection    
  18.        try {    
  19.            Statement stat = getConnection().createStatement();    
  20.        } catch (SQLException e) {    
  21.            e.printStackTrace();    
  22.        }    
  23.     }    
  24. }  

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值