public void stop() {
   try {
     InitialContext ictx = new InitialContext();
     ictx.unbind(USER_TRANSACTION_JNDI_NAME);
   } catch (Exception e) {
     e.printStackTrace();
   }
   jotm.stop();
   jotm = null;
 }
  public MultipleConnection(String[] args) throws Exception {
    if (args.length != 2) {
      System.out.println(USAGE);
      System.exit(1);
    }

    // first, load the properties from the spy.properties file
    Properties prop = new Properties();
    try {
      prop.load(ClassLoader.getSystemResourceAsStream("spy.properties"));
    } catch (Exception e) {
      System.err.println("problem to load properties.");
      e.printStackTrace();
      System.exit(1);
    }

    login = prop.getProperty("login");
    password = prop.getProperty("password");
    url = prop.getProperty("url");
    driver = prop.getProperty("driver");

    // completion is either "commit", either "rollback"
    String completion = args[0];

    // get the new value which will be assign to the database
    int newValue = 0;
    try {
      newValue = Integer.parseInt(args[1]);
    } catch (NumberFormatException e) {
      System.err.println(USAGE);
      System.err.println("[number] has to be an integer\n");
      System.exit(1);
    }

    // Get a transaction manager
    try {
      // creates an instance of JOTM with a local transaction factory which is not bound to a
      // registry
      jotm = new Jotm(true, false);
      InitialContext ictx = new InitialContext();
      ictx.rebind(USER_TRANSACTION_JNDI_NAME, jotm.getUserTransaction());
    } catch (Exception e) {
      System.err.println("JOTM problem.");
      e.printStackTrace();
      System.exit(1);
    }

    // get an user transaction
    UserTransaction utx = null;
    try {
      System.out.println("create initial context");
      Context ictx = new InitialContext();
      System.out.println("lookup UserTransaction at : " + USER_TRANSACTION_JNDI_NAME);
      utx = (UserTransaction) ictx.lookup(USER_TRANSACTION_JNDI_NAME);
    } catch (Exception e) {
      System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown");
      System.err.println("Exception message :" + e.getMessage());
      e.printStackTrace();
      System.exit(1);
    }

    // create an XA pool datasource with a minimum of 4 objects
    StandardXAPoolDataSource spds = new StandardXAPoolDataSource(4);
    spds.setMaxSize(15);
    spds.setMinSize(13);
    spds.setUser(login);
    spds.setPassword(password);

    // create an XA datasource which will be given to the XA pool
    StandardXADataSource xads = new StandardXADataSource();
    try {
      xads.setDriverName(driver);
      xads.setUrl(url);
      xads.setUser(login);
      xads.setPassword(password);
    } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
    }
    // give the XA datasource to the pool (to create futur objects)
    spds.setTransactionManager(jotm.getTransactionManager());
    spds.setDataSource(xads);

    try {
      System.out.println("** begin a transaction **");
      utx.begin();

      conn = spds.getConnection(login, password);
      PreparedStatement pstmt = conn.prepareStatement(SQL_QUERY);
      pstmt.setInt(1, newValue);
      pstmt.executeUpdate();
      System.out.println("dump, after the first update:");
      printTable();
      pstmt.close();
      conn.close();

      conn = spds.getConnection(login, password);
      PreparedStatement pstmt2 = conn.prepareStatement(SQL_QUERY);
      pstmt2.setInt(1, newValue + 2);
      pstmt2.executeUpdate();
      System.out.println("dump, after the second update:");
      printTable();
      pstmt2.close();
      conn.close();

      if (completion.equals("commit")) {
        System.out.println("** commit ** the transaction");
        utx.commit();
      } else {
        System.out.println("** rollback ** the transaction");
        utx.rollback();
      }
    } catch (Exception e) {
      System.err.println("Exception of type :" + e.getClass().getName() + " has been thrown");
      System.err.println("Exception message :" + e.getMessage());
      e.printStackTrace();
      System.exit(1);
    }

    System.out.println("dump, after work:");
    conn = spds.getConnection(login, password);
    printTable();
    conn.close();
    stop();
  }
 public void close() {
   tmService.stop();
 }
 public TransactionManager newTransactionManager() {
   return tmService.getTransactionManager();
 }