我知道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();
}
Run Code Online (Sandbox Code Playgroud)
如果这被用于多个线程可以调用它的地方并且只有一个共享的sqlMapper对象会有一些线程正在执行批处理,因为另一个线程调用了executeBatch()?如果我在其他线程中使用相同的sqlMapper进行删除更新等许多其他方法,这就成了一个问题.
我不想在一个线程中启动事务,并在上一个线程完成之前有另一个线程提交.
我知道我可以同步所有这些,但宁愿不必.
在内部,org.ibatis.sqlmap.engine.impl.SqlMapClientImpl 使用aThreadLocal来存储它的内部会话,因此即使许多线程共享相同的SqlMapClient引用,该类也为每个线程使用不同的内部对象.