请教关于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就行了。