首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

读ibatis源码—为何说SqlMapClient是线程安全的

2012-11-07 
读ibatis源码—为什么说SqlMapClient是线程安全的Ibatis做为一个半自动化的Orm框架有他的缺点和优点。在这里

读ibatis源码—为什么说SqlMapClient是线程安全的
Ibatis做为一个半自动化的Orm框架有他的缺点和优点。在这里我就不宽泛的说这些了。就说说为什么SqlMapClient是线程安全的,他是怎么实现的。

提出问题:



这是一段ibatis simple工程的代码,大家都能看明白这是一个单例,只有一个SqlMapClient对象存在,在多线程的情况下,SqlMapClient是怎么解决事务隔离呢,怎么共享资源的呢?

一、SqlMapClient是怎么被创建的
打开SqlMapClientBuilder发现buildSqlMapClien一句话


打开NodeletParser的parse方法,我们发现他就是解析xml配置文件的


最后这些文件被分门别类的放在了XmlParserState的这些属性里
public T get() {        Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);        if (map != null)            return (T)map.get(this);        // Maps are constructed lazily.  if the map for this thread        // doesn't exist, create it, with this ThreadLocal and its        // initial value as its only entry.        T value = initialValue();        createMap(t, value);        return value;    }    public void set(T value) {        Thread t = Thread.currentThread();        ThreadLocalMap map = getMap(t);        if (map != null)            map.set(this, value);        else            createMap(t, value);    }

以上是ThreadLocal的get,set方法的源码,从中我们可以看出,我们用的ThreadLocal实质是一个map,没一个ThreadLocal变量都是一个map,key为线程Id
4 楼 tou3921 2010-01-14   很好//////
5 楼 fight_bird 2010-01-18   精神可嘉,这是线程安全的标准实现方式,但不是最高效的方式,其实iBATIS官方文档说得很清楚了。 6 楼 J-catTeam 2010-03-28   ThreadLocal的并不是起着实现线程安全的作用。使用了ThreadLocal还是会出现线程安全的问题
ThreadLocal是为了提供一个跨方法,跨类的变量副本保存。一个ThreadLocal保存一个

热点排行