代码之家  ›  专栏  ›  技术社区  ›  Nick

iBatis SqlMapClient和线程安全

  •  5
  • Nick  · 技术社区  · 16 年前

    我知道API的状态是“使用SQL映射的线程安全客户机”,但我想更好地理解它的工作原理,并想知道是否有人在多线程环境中运行这个事务。例如,使用:

    void doSomeSql() throws SQLException{
      sqlMapper.startTransaction();
      sqlMapper.startBatch();
      final Map paramMap = new HashMap();
      paramMap.put("data", "data"); 
      Integer num = (Integer) sqlMapper.queryForObject("getRowCount", paramMap);//get row count
      sqlMapper.insert("insertData", paramMap); //insert row
      num = (Integer) sqlMapper.queryForObject("getRowCount", paramMap);//get row count again
      sqlMapper.executeBatch();
      sqlMapper.commitTransaction();
    }
    

    如果在多个线程可以调用它的地方使用了这个,并且只有一个共享的sqlMapper对象,是否会有一些线程正在执行批处理,因为另一个线程称为executeBatch()?如果我有很多其他方法在其他线程中使用相同的sqlMapper来执行delete的更新等操作,那么这个问题就更严重了。

    我不想在一个线程中启动一个事务,在前一个线程完成之前提交另一个线程。

    我知道我可以同步所有这一切,但宁愿不必。

    2 回复  |  直到 16 年前
        1
  •  6
  •   matt b    16 年前

    在内部, org.ibatis.sqlmap.engine.impl.SqlMapClientImpl uses a ThreadLocal SqlMapClient the class uses a different internal object for each thread .

        2
  •  2
  •   Brian    16 年前