代码之家  ›  专栏  ›  技术社区  ›  ps0604

在无状态bean中禁用数据库事务

  •  0
  • ps0604  · 技术社区  · 7 年前

    WildFly 14 我有一个 @Stateless 使用不同的连接/数据库运行两个select的bean:

    InitialContext context = new InitialContext();
    DataSource ds = (DataSource)context.lookup("jndi/to/db/1");
    Connection conn = ds.getConnection();
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select * from table1"); // table1 in db 1
    
    .........
    .........
    
    InitialContext context2 = new InitialContext();
    DataSource ds2 = (DataSource)context.lookup("jndi/to/db/2");
    Connection conn2 = ds2.getConnection();  // <-- here it fails
    Statement stmt2 = conn2.createStatement();
    ResultSet rs2 = stmt2.executeQuery("select * from table2"); // table2 in db 2
    

    我在第二个选择中收到警告(也失败了):

    ARJUNA012140: Adding multiple last resources is disallowed
    

    根据这个 link 问题是,我正在运行一个带有两个不同数据库的事务。注意,数据源没有配置XA选项,因为在我的应用程序中没有更新用例来更新单个事务中的两个数据库。

    我遇到问题的bean是只读的,它只执行两个SQL选择。

    我尝试用以下方法来注释bean方法:

    @TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER) 
    

    但我得到了运行时错误:

    WFLYEJB0063: Transaction present on server in Never call (EJB3 13.6.2.6)
    

    为什么存在交易?如何禁用它?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Carlitos Way    7 年前

    而不是 @TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)

    用途:

    @TransactionAttribute(javax.ejb.TransactionAttributeType.NOT_SUPPORTED)

    这使得无状态bean可以避免将自己附加到当前正在运行的事务;并像根本没有事务一样运行…

    为什么存在交易?

    我真的不知道…是否调用了任何其他J2EE组件(例如,用注释 @Transactional 或者其他EJB)在调用无状态bean之前?