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

时间:2019-01-18 21:15:51

标签: java java-ee wildfly java-ee-8

WildFly 14中,我有一个@Stateless bean,该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 个答案:

答案 0 :(得分:1)

代替@TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)

使用:

@TransactionAttribute(javax.ejb.TransactionAttributeType.NOT_SUPPORTED)

这使Stateless Bean避免将其自身附加到当前正在运行的事务;并像根本没有任何交易一样运行...

  

为什么要进行交易?

我真的不知道...在调用无状态Bean之前,您是否调用了其他J2EE组件(例如,带有@Transactional的CDI bean或其他EJB)?