iBatis SqlMapClient и безопасность потоков - PullRequest
5 голосов
/ 23 июля 2010

Я знаю состояние 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 ()?Это становится большей проблемой, если у меня есть много других методов, выполняющих обновления delete и т. Д., Использующих тот же sqlMapper в других потоках.

Я не хочу начинать транзакцию в одном потоке, а другой поток фиксируется перед предыдущим потокомбыло сделано.

Я понимаю, что могу синхронизировать все это, но лучше не делать этого.

Ответы [ 2 ]

6 голосов
/ 23 июля 2010

Внутренне, org.ibatis.sqlmap.engine.impl.SqlMapClientImpl использует ThreadLocal для хранения своих внутренних сеансов, поэтому даже если многие потоки используют одну и ту же ссылку SqlMapClient, класс использует разные внутренние объекты для каждого нить .

2 голосов
/ 23 июля 2010

Каждый поток получит свое собственное соединение с БД, и транзакции будут работать так, как вы хотите: они также для каждого соединения с БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...