【问题标题】:iBatis SqlMapClient and thread safetyiBatis SqlMapClient 和线程安全
【发布时间】:2010-07-23 14:20:07
【问题描述】:

我知道 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 进行删除更新等,这将成为一个更大的问题。

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

我知道我可以同步所有这些,但我不想这样做。

【问题讨论】:

    标签: java ibatis


    【解决方案1】:

    在内部,org.ibatis.sqlmap.engine.impl.SqlMapClientImpluses a ThreadLocal 存储它的内部会话,所以即使许多线程共享相同的SqlMapClient 引用,the class uses a different internal object for each thread

    【讨论】:

      【解决方案2】:

      每个线程都有自己的数据库连接,事务按照您想要的方式工作:它们也是每个数据库连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 2014-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多