如题。这个SqlMapClient有这么些方法:
startTransaction:开启事务
commitTransaction:提交事务
delete
update
insert
...这是不是跟session一个样?但是它又有openSession方法。。这个又跟SessionFactory一个样。
我问这个的缘由是:考虑并发问题。SessionFactory适合用单例吗?适合,Hibernate的Session适合用单例吗?不适合,你觉得sessionFactory.getCurrentSession取出来的session一样吗?如果 两个用户同时访问一个sessionFactory的getCurrentSession,取出来的session肯定是不一样的,因为hibernate的session相当 于一个连接 ,你让一个连接 同时做两个事?那当然 会混乱 吧Hibernate中,简单理解 是:
session相当 于一个Connection, SessionFactory相当于Connection的池子那么 在ibatis中呢,SqlMapClient相当于Connection,还是池子?如果 相当于Connection,那么SqlMapClient不可以 用单例 
如果 相当于池子,那么 SqlMapClient可以 用单例 
你们明白 我的意思 吗?求大侠!!!!!!!!!

解决方案 »

  1.   

    session 是用完之后释放出来的,不是说你在用着,别的线程也进来用了。
    如果session在用的,那么别的线程就会开启一个新的session了。
    并没有并发。
      

  2.   

    这跟可不可以用单例没关系吧?ibatis和hibernate差不多的,只是ibatis映射的是结果集跟sql语句。
    SqlMapClient 相当于sessionfactory 吧
      

  3.   

    sqlMapClient相当于sessionfactory.
    ibatis也有自己的session叫SqlMapSession,com.ibatis.sqlmap.client.SqlMapSession
    ibatis的并发是通过sqlMapClientImpl中的ThreadLocal来完成的
      

  4.   


    那么我的SqlMapClient可以用synchrized修饰吗?
      

  5.   

    但是sqlMapClient有begeinTransactin等方法,这在hibernate中是用session的方法这个怎么解释?
      

  6.   

    public class ThreadLocal<T>extends Object
    该类提供了线程局部变量。这些变量不同于它们的普通对应物,因为访问一个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。每个线程的sqlMapClient在操作时都对应到该线程唯一的一个sqlMapSession;所以sqlMapClient.begeinTransactin()其实等于sqlMapClient.getLocalSqlMapSession().begeinTransactin()