TX その18 スレッドとTransaction Contextの関係

TxManager.associateThreadメソッド

public void associateThread(Transaction transaction)
{
  if (transaction != null && !(transaction instanceof TransactionImpl))
     throw new RuntimeException("Not a TransactionImpl, but a " +
           transaction.getClass().getName());

  // Associate with the thread
  TransactionImpl transactionImpl = (TransactionImpl) transaction;
  ThreadInfo ti = getThreadInfo();
  ti.tx = transactionImpl;
  transactionImpl.associateCurrentThread();
}

private void associateThread(ThreadInfo ti, TransactionImpl transaction)
{
  // Associate with the thread
  ti.tx = transaction;
  transaction.associateCurrentThread();
}

TxManager.disassociateThreadメソッド

public Transaction disassociateThread()
{
  return disassociateThread(getThreadInfo());
}

private Transaction disassociateThread(ThreadInfo ti) {
  TransactionImpl current = ti.tx;
  ti.tx=null;
  current.disassociateCurrentThread();
  return current;
} 

単純にThreadInfoオブジェクトに貼り付けたりはがしたりしているだけ.

ThreadInfo自身は

private ThreadInfo getThreadInfo()
{
  ThreadInfo ret = (ThreadInfo) threadTx.get();

  if (ret == null)
  {
     ret = new ThreadInfo();
     ret.timeout = timeOut;
     threadTx.set(ret);
  }

  return ret;
}

static class ThreadInfo
{
  long timeout;
  TransactionImpl tx;
}

ほんとうにただのTransactionImplの入れ物という感じ.再利用のためだけの仕組み.