获取JDBC连接时出错:无法在输入元感知对象时登记事务

时间:2010-09-30 00:54:15

标签: java jdbc jboss ejb-3.0 jndi

我在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()时会抛出异常。

4 个答案:

答案 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托管容器托管事务。例如,此解决方案也在CodeRanchJBoss forum中提出。

答案 3 :(得分:-4)

我将事务管理器更改为bean管理,并且完美运行。