请教关于jboss上使用jta的问题,是不是jta无法在远程的客户端上使用?

07-04-16 chengang

各位高手:
我在jboss上配置了支持jta的oracle数据源,但当在客户端上(是应用程序的胖客户端)启动jta事务时老是出错,
javax.transaction.SystemException: java.lang.RuntimeException: UT factory lookup failed

代码如下:
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
properties.put(Context.PROVIDER_URL, "10.48.44.41");
properties.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
String name = null;
UserTransaction ut = null;
try {
Context ctx = new InitialContext(properties);
ut=(UserTransaction)ctx.lookup("UserTransaction");
ut.begin();
javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("XAOracleDS");
Connection conn = ds.getConnection();
Statement stmt=conn.createStatement();
String sql="select name from service_area t where t.area_id = 77";
ResultSet rs = stmt.executeQuery(sql);
rs.next();
name = rs.getString("name");
//sql = "update service_area set name = 33 where area_id = 1";
//stmt.executeUpdate(sql);
stmt.close();
conn.close();
ctx.close();
ut.commit();
} catch (Exception e1) {
e1.printStackTrace();
/* try {
ut.rollback();
} catch (IllegalStateException e2) {
// TODO 自动生成 catch 块
e2.printStackTrace();
} catch (SecurityException e2) {
// TODO 自动生成 catch 块
e2.printStackTrace();
} catch (SystemException e2) {
// TODO 自动生成 catch 块
e2.printStackTrace();
}*/
}
请问各位是什么原因,怎么解决?
是不是jta是无法在远程的客户端上使用的?

banq
2007-04-16 14:20

JBoss调用JTA没这么复杂吧,直接使用JNDI就可以了。名称为"java:/TransactionManager"

TransactionManager transactionManager = (TransactionManager)new InitialContext().lookup("java:/TransactionManager")
transactionManager.begin()


transactionManager.commit();

transactionManager.rollback();

diz
2007-04-17 14:46

根据我的理解容器的JTA是可以远程调用的!

楼主的问题我怀疑是JTA的Naming错误!你把jboss-console打开,然后查一下JTA的Remote Name!我记得好像是叫JTATransactionManager

chengang
2007-04-22 21:40

问题已经解决了只要把org.jnp.interfaces.NamingContextFactory换成org.jboss.naming.NamingContextFactory就行了。