Connection has already been created in this tx context for pool named jnboracle.
Illegal attempt to create connection from another pool: testpool
怎麽办?database is oracle !
1。connection pool必须是扩展了tx的DriveClass,如:drive classname:oracle.jdbc.xa.client.OracleXADataSource;
2。DataSource 必须是TxDataSource。
3。代码中从jndi中取得相应的DataSource,进行操作便OK
至于具体console操作你该知道咯!
以下是我的Transaction测试代码
---------------------------------
public class JDBCTransaction{
public final String UT_JNDI_Name = "javax.transaction.UserTransaction";
public final String DS_JNDI_Name1 = "AndyDS1";
public final String DS_JNDI_Name2 = "AndyDS2";
private Hashtable ht = null;
private Context ctx = null;
private UserTransaction ut = null;
private Connection conn1 = null;
private Connection conn2 = null;
private Statement stmt1 = null;
private Statement stmt2 = null;
private Context getInitialContext()throws NamingException{
ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://andy:7001");
return new InitialContext(ht);
}
public void CreateNewRecord(int id, String name, int age, String status) {
String SQL = "";
try{
ctx = getInitialContext();
ut = (UserTransaction)ctx.lookup(UT_JNDI_Name);
ut.begin();
DataSource ds1 = (DataSource)ctx.lookup(DS_JNDI_Name1);
conn1 = ds1.getConnection();
DataSource ds2 = (DataSource)ctx.lookup(DS_JNDI_Name2);
conn2 = ds2.getConnection();
conn1.setAutoCommit(false);
conn2.setAutoCommit(false);
stmt1 = conn1.createStatement();
stmt2 = conn2.createStatement();
SQL = "insert into t1 values(" + id + ", '" + name + "', '" + status + "')";
stmt1.executeQuery(SQL);
System.out.println("SQL: " + SQL);
SQL = "insert into t2 values(" + id + " ," + age + ")";
stmt2.executeQuery(SQL);
System.out.println("SQL: " + SQL);
ut.commit();
System.out.println("Transaction commit !");
}
catch(Exception e){
e.printStackTrace();
try{
ut.rollback();
System.out.println("Transaction rollback !");
}
catch(Exception e1){
e1.printStackTrace();
}
}
}
}
你可以用我的代码试一试,我没遇到问题。