我在EJB SessionBean
中获取JDBC连接时遇到问题。错误是:
org.jboss.util.NestedSQLException:输入元感知对象时无法在事务中登记! - 嵌套throwable:(javax.transaction.SystemException:java.lang.Throwable:无法登记资源,请参阅先前的警告。
我认为会发生这种情况,因为我已经有一个来自不同数据源的开放连接,因此我配置了 XA数据源以避免交易问题,但它根本不起作用,所以我不喜欢我知道我的代码中是否有错误。这是:
try
{
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
p.put(Context.PROVIDER_URL,"jnp://localhost:11099");
p.put("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ic = new InitialContext(p);
DataSource dataSource = (DataSource)ic.lookup("java:/jdbc/etlreportservices");
return dataSource.getConnection();
}
catch(Exception e)
{
e.printStackTrace();
}
调用dataSource.getConnection()
时会抛出异常。
答案 0 :(得分:6)
可以尝试, 对于老Jboss-es: /server/all/conf/jbossjta-properties.xml
<properties depends="arjuna" name="jta">
<property name="com.arjuna.ats.jta.allowMultipleLastResources" value="true"/>
</properties>
for new: standalone \ configuration \ standalone.xml(或其他你使用的)
<system-properties>
<property name="com.arjuna.ats.arjuna.allowMultipleLastResources" value="true"/>
</system-properties>
答案 1 :(得分:1)
在tx超时的情况下,我注意到了这一点。 FWIW。
答案 2 :(得分:0)
使用JBoss 6.0.0时,错误消息略有不同:
引起:org.jboss.resource.JBossResourceException:输入元感知对象时无法在事务中登记!
至于原因:引自here
在同一过程中,正在对不同的非XA数据源进行两次调用。 JBoss默认不支持此功能。
同一站点显示的解决方案不适用于JBoss 6.0.0。
一般解决方案是将同一事务中涉及的所有数据源更改为 XA数据源。然后它适用于 bean托管和容器托管事务。例如,此解决方案也在CodeRanch和JBoss forum中提出。
答案 3 :(得分:-4)
我将事务管理器更改为bean管理,并且完美运行。